链表java参考

时间:2017-04-15 02:11:57

标签: java linked-list insert implementation

我有一个链接列表java实现。但是我不理解的一部分。我的类是

public class MyConsumer implements Runnable {
    @Override
    public void run() {
        while (true) {
            ConsumerRecords<String, LogLine> records = consumer.poll(Long.MAX_VALUE);
            // does something
        }
    }
}

我有一个要插入的fn

class Node {
    int data;
    Node next;
    Node(int d) {
        data = d;
        next = null;
    }
}

我不理解的是,首先我们将头部设置为当前变量。 并将下一个节点传递给当前对象进行遍历。

我的问题是如何工作的,因为当前有头部参考,所以当你从技术上分配另一个值时,你正在改变头脑。我可以看到int data.if我将current.data更新为0然后我看到头部受到影响..

可能是一个低于标准的问题,但请帮助我理解这里发生的事情......

3 个答案:

答案 0 :(得分:0)

这个函数基本上是将新元素添加为链表集合的HEAD元素。每个元素都有一个对NEXT元素的引用,因此只要下一个元素不存在它就会遍历,然后将它设置为新元素(具有传递给函数的数据)。 我不确定我是否了解您的担忧,而是通过更改&#34; current&#34;变量,您只需更改&#34;参考&#34;到一个物体,而不是改变物体本身。所以只要下一个项目不存在就改变引用,然后你创建一个新的对象,并设置为前头引用(并且这个对象成为一个新头)

答案 1 :(得分:0)

我重新安排了代码,使其更容易理解,并添加了评论:

/**
 *Insert a leaf node in a linked list
 *@param head represents the head node of the list.
 *@return the head node 
 */
public static  Node insert(Node head,int data) {

     //if head does not exist, create it and return it 
    if (head==null) {
        return head=new Node(data);
    }

    else{//head exist

        //search for the end of the linked list (leaf, has no next node)
        Node current = head;
        while(current.next!=null){
            current = current.next;  
        }
        //at the end of loop the current.next == null (leaf)
        //add new node as leaf
        current.next = new Node(data);
        return head; //return head unchanged 
    } 

}

我希望有助于澄清。

答案 2 :(得分:0)

当您将某个节点(不仅仅是值)分配给当前节点时,您并没有更改该特定节点。在这里,您已将head分配为当前节点。但这并不意味着两个节点现在都相同。他们仍然不同。 head节点将始终具有相同的值,除非有人专门键入head = [enter another node here],然后将不同的节点分配给头节点。在Java中,=表示赋值,==表示等于。因此赋值和相等是两个不同的概念。

单链接列表示例: 1-> 2-> 3-> NULL (我们知道head = Node(1)) 现在,假设用户呼叫insert(head, 4)

执行步骤:

  1. Node current = head,所以current == Node(1)和head == Node(1)(current和head是两个不同的节点,但现在具有相同的值)
  2. head为空,因此在if语句中执行语句
  3. current.next == Node(2),因此它不是null。在while循环中执行语句
  4. current = current.next,因此为当前节点分配了Node(2)
  5. current.next == Node(3),因此它不是null。在while循环中执行语句
  6. current = current.next,因此为当前节点分配了Node(3)
  7. current.next == NULL,因此请在while循环中停止
  8. current.next = new Node(4),所以我们将Node(4)分配给current.next
  9. 现在,我们从头开始返回列表。头仍然是Node(1)。

结果:1​​-> 2-> 3-> 4->空