Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linkedlist在java中的实现_Java_Linked List - Fatal编程技术网

linkedlist在java中的实现

linkedlist在java中的实现,java,linked-list,Java,Linked List,我尝试在java中使用Node类实现linkedlist,并且只保留一个指向linkedlist开头的链接(我们称之为“first”) 我需要处理两个案子- 1.当linkedlist为空时-在这种情况下,我需要在“first”创建一个新节点 2.当linkedlist中存在节点时 我试着按照下面的方式编写代码,但我想知道这是否是标准的方式处理第一个案例的代码块看起来有点难看 这样做的标准方法是什么 public class MyLList<Item>{ Node first

我尝试在
java
中使用
Node
类实现linkedlist,并且只保留一个指向linkedlist开头的链接(我们称之为“first”)

我需要处理两个案子-

1.当linkedlist为空时-在这种情况下,我需要在“first”创建一个新节点

2.当linkedlist中存在节点时

我试着按照下面的方式编写代码,但我想知道这是否是标准的方式处理第一个案例的代码块看起来有点难看

这样做的标准方法是什么

public class MyLList<Item>{
    Node first;

    public  void insertAtBeginning(Item item){
        Node old = first;
        first = new Node();
        first.item = item;
        first.next = old;
    }

    public void insertAtEnd(Item item){
        Node t = first;
        while(t!=null && t.next!=null){
            t=t.next;
        }

        if(t==null){
            first = new Node();
            first.item = item;
            return;
        }
        Node old = t;
        t = new Node();
        t.item = item;
        old.next = t;
    }

    public void traverse(){
        for(Node x=first;x!=null;x=x.next){
            System.out.print(x.item+" ");
        }
    }

    private class Node{
        Item item;
        Node next;
    }


    public static void main(String[] args) {
        MyLList<String> ll = new MyLList<String>();

        ll.insertAtEnd("X");
        ll.insertAtBeginning("B");
        ll.insertAtEnd("Y");
        ll.traverse();

    }

}
公共类列表{
节点优先;
公共无效插入开始(项目){
节点旧=第一;
第一个=新节点();
first.item=项目;
first.next=old;
}
公共无效插入项(项目){
节点t=第一;
while(t!=null&&t.next!=null){
t=t.next;
}
如果(t==null){
第一个=新节点();
first.item=项目;
返回;
}
节点old=t;
t=新节点();
t、 项目=项目;
old.next=t;
}
公共空间遍历(){
for(节点x=first;x!=null;x=x.next){
系统输出打印(x.item+“”);
}
}
私有类节点{
项目;
节点下一步;
}
公共静态void main(字符串[]args){
MyLList ll=新的MyLList();
ll.Insertaden(“X”);
ll.插入开始(“B”);
ll.Insertaden(“Y”);
ll.traverse();
}
}

创建一个表示链接列表根的空节点,这样就不需要特别处理“root为null”的情况

大概是这样的:

    static void Main(String[] args)
    {
        MyLList<String> ll = new MyLList<String>();

        ll.insertAtEnd("X");
        ll.insertAtBeginning("B");
        ll.insertAtEnd("Y");
        ll.Traverse();

    }

    public class MyLList<Item>
    {
        Node first = new Node();

        public void insertAtBeginning(Item item)
        {
            Node oldFirst = first.next;

            first.next = new Node();
            first.next.item = item;
            first.next.next = oldFirst;
        }

        public void insertAtEnd(Item item)
        {
            Node tail = first;
            while (tail.next != null)
            {
                tail = tail.next;
            }

            tail.next = new Node();
            tail.next.item = item;
        }

        public void traverse()
        {
            for (Node x = first.next; x != null; x = x.next)
            {
                Console.Out.WriteLine(x.item + " ");
            }
        }

        private class Node
        {
            public Item item;
            public Node next;
        }



    }
static void Main(字符串[]args)
{
MyLList ll=新的MyLList();
ll.Insertaden(“X”);
ll.插入开始(“B”);
ll.Insertaden(“Y”);
ll.Traverse();
}
公共类列表
{
Node first=新节点();
公共无效插入开始(项目)
{
节点oldFirst=first.next;
first.next=新节点();
first.next.item=项目;
first.next.next=oldFirst;
}
公共无效插入项(项目)
{
节点尾=第一;
while(tail.next!=null)
{
tail=tail.next;
}
tail.next=新节点();
tail.next.item=项目;
}
公共空间遍历()
{
for(节点x=first.next;x!=null;x=x.next)
{
Console.Out.WriteLine(x.item+“”);
}
}
私有类节点
{
公共项目;
公共节点下一步;
}
}

创建一个表示链接列表根的空节点,这样就不需要特别处理“root为null”的情况

大概是这样的:

    static void Main(String[] args)
    {
        MyLList<String> ll = new MyLList<String>();

        ll.insertAtEnd("X");
        ll.insertAtBeginning("B");
        ll.insertAtEnd("Y");
        ll.Traverse();

    }

    public class MyLList<Item>
    {
        Node first = new Node();

        public void insertAtBeginning(Item item)
        {
            Node oldFirst = first.next;

            first.next = new Node();
            first.next.item = item;
            first.next.next = oldFirst;
        }

        public void insertAtEnd(Item item)
        {
            Node tail = first;
            while (tail.next != null)
            {
                tail = tail.next;
            }

            tail.next = new Node();
            tail.next.item = item;
        }

        public void traverse()
        {
            for (Node x = first.next; x != null; x = x.next)
            {
                Console.Out.WriteLine(x.item + " ");
            }
        }

        private class Node
        {
            public Item item;
            public Node next;
        }



    }
static void Main(字符串[]args)
{
MyLList ll=新的MyLList();
ll.Insertaden(“X”);
ll.插入开始(“B”);
ll.Insertaden(“Y”);
ll.Traverse();
}
公共类列表
{
Node first=新节点();
公共无效插入开始(项目)
{
节点oldFirst=first.next;
first.next=新节点();
first.next.item=项目;
first.next.next=oldFirst;
}
公共无效插入项(项目)
{
节点尾=第一;
while(tail.next!=null)
{
tail=tail.next;
}
tail.next=新节点();
tail.next.item=项目;
}
公共空间遍历()
{
for(节点x=first.next;x!=null;x=x.next)
{
Console.Out.WriteLine(x.item+“”);
}
}
私有类节点
{
公共项目;
公共节点下一步;
}
}

您可以将其更改为更清晰:

public void insertAtEnd(Item item){
    if (first == null)
        insertAtBeginning(Item item);
    else{
        Node t = first;
        while(t!=null && t.next!=null){
            t=t.next;
        }

        Node old = t;
        t = new Node();
        t.item = item;
        old.next = t;
    }        
}

您可以将其更改为更清晰:

public void insertAtEnd(Item item){
    if (first == null)
        insertAtBeginning(Item item);
    else{
        Node t = first;
        while(t!=null && t.next!=null){
            t=t.next;
        }

        Node old = t;
        t = new Node();
        t.item = item;
        old.next = t;
    }        
}
具有以下功能的链表程序
1.开头插入
2.末端插入
3.在任何位置插入
4.在位置处删除
5.变大
6.展示
7.空状态
8.在给定位置替换数据
9按位置获取元素
10递归搜索元素
11仅交换数据而不交换节点
12为给定数据交换节点
13倒过来
14查找中间元素
15计数一个数字的出现次数
导入java.util.NoSuchElementException;
导入java.util.Scanner;
类节点{
Node next=null;
T数据;
节点(T数据){
这个数据=数据;
this.next=null;
}
}
类链接列表{
节点头=空;
节点last=null;
公共链接列表(){
head=null;
last=null;
}
public void insertafirst(T数据){
节点nptr=新节点(数据);
if(head==null){
水头=nptr;
最后=头部;
}否则{
nptr.next=水头;
水头=nptr;
}
显示器(头部);
}
公共void插入列表(T数据){
节点nptr=新节点(数据);
if(空()){
水头=nptr;
last=nptr;
}否则{
last.next=nptr;
last=nptr;
}
显示器(头部);
}
公共void插入位置(int位置,T数据){
if(空()){
insertAtFirst(数据);
返回;
}
节点头ptr=头;
位置-=1;
对于(int i=1;i