我有一个链接列表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然后我看到头部受到影响..
可能是一个低于标准的问题,但请帮助我理解这里发生的事情......
答案 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)
?
执行步骤:
Node current = head
,所以current == Node(1)和head == Node(1)(current和head是两个不同的节点,但现在具有相同的值)head
为空,因此在if语句中执行语句current.next == Node(2)
,因此它不是null。在while循环中执行语句current = current.next
,因此为当前节点分配了Node(2)current.next == Node(3)
,因此它不是null。在while循环中执行语句current = current.next
,因此为当前节点分配了Node(3)current.next == NULL
,因此请在while循环中停止current.next = new Node(4)
,所以我们将Node(4)分配给current.next 结果:1-> 2-> 3-> 4->空