在Java中的LinkeList的开头插入一个新节点

时间:2015-07-27 17:25:29

标签: java data-structures linked-list

我已经检查过我们在SO中发布的几篇帖子。

Insert new node at the beginning of Linked-List

How do I insert a node at the beginning of a linked list?

并在java中实现了一个简单的LinkedList,效果很好。

我无法理解的是如何在LinkedList的开头添加新节点实际上是有效的。

以下是我在LinkedList的开头添加Node的代码片段如下所示:

public class SinglyLinkedList
{
    //Private variable to keep tab of the HEAD of the linked list.
    private ListNode head;

    //Private variable to keep track of the node count in this singly linked list.
    private int length;
.
.
.
    /**
    * Insert a ListNode at the beginning of this List.
    */
    public synchronized void insertAtBegin(ListNode newNode)
    {
        //Set current head as the next of input ListNode
        newNode.setNext(head);

        //Set the input ListNode as the new head of this SinglyLinkedList
        head = newNode;

        //Increment the SinglyLinkedList length
        length++;
    }
.
.
.
}//End of class SinglyLinkedList

ListNode类表示单个节点,如下所示:

/**
* Represents a Node of the Linked List.
*/
public class ListNode
{
    private ListNode next;  
    private int data;

    /**
    * Constructors
    */
        public ListNode()
        {
            next = null;
            data = Integer.MIN_VALUE;
        }
        public ListNode(int data)
        {
            next = null;
            this.data = data;
        }

    /**
    * Accessor methods.
    */  
        public int getData()
        {
            return this.data;
        }

        public void setData(int data)
        {
            this.data = data;
        }

        public ListNode getNext()
        {
            return next;
        }

        public void setNext(ListNode listNode)
        {
            this.next = listNode;
        }

        public String toString()
        {
            return Integer.toString(data);
        }

}//End of class ListNode

让我感到困惑的两条线是:

//Set current head as the next of input ListNode
        newNode.setNext(head);
        //Set the input ListNode as the new head of this SinglyLinkedList
        head = newNode;

我越是尝试分析这两行,我觉得它会创建一个循环引用结构,而不是推入“newNode”来代替“head”。 可能我不太明白如何传递Java引用。

是否有解释为什么上述两行不会以循环引用结束?

3 个答案:

答案 0 :(得分:2)

想象一下,您有以下LinkedList:

2 -> 3 -> 4 -> 5

并且您希望在开头插入值为1的节点。我们将此节点称为newNode

现在看一下这一行:newNode.setNext(head);您将newNode的{​​{1}}值指向next,在这种情况下指向节点值为head。这就是您的列表现在的样子:

2

但是,1 -> 2 -> 3 -> 4 -> 5 仍然指向值为head的节点,因此您必须通过使2指向值为{{1的节点来解决此问题。 },这是head。这就是1行的作用。

答案 1 :(得分:2)

当您的列表从右向左移动时,即1然后在新节点插入后它变为2->1,然后在新插入后变为3->2->1,在这种情况下您需要采取只关心两件事:(列表的第一个元素)&接下来要插入的临时节点。这是伪代码:

`  while(you_want_to_insert_new_node)        //temporary is the node to be inserted freshly       
               {
                   Insert(temporary->data);  //Insert data in temporary node
                   temporary->next=head;
                   head=temporary;
               }
 `

当您的列表从左向右移动时,即1->2,然后它变为1->2->3等等,您需要处理3件事: head 当前节点和临时。这是伪代码:

` 
  current=head;
  while(you_want_to_insert_new_node)         //temporary is the node to be inserted freshly
                      {            
                                 Insert(temporary->data); //Insert data in temporary node
                                 current->next = temporary;
                                 current=temporary;
                      }

答案 2 :(得分:2)

您似乎从概念上理解LinkedList如何获得新的头节点。您的问题与Java本身更相关。

请记住,Java是按值传递的;当您传递对象时,您不会传递对象的值 - 您将指针的值传递给该对象。 Is Java "pass-by-reference" or "pass-by-value"?

因此,考虑到这一点,让我分解这两行。

newNode.setNext(head)

head中的值是指向节点的指针。因此setNext函数根据pass-by-value接收指向节点的指针。它没有收到指向头部的指针。

head = newNode;

在这一行中,我们将头部的VALUE重新指定为新创建的节点的指针。 newNode.next中的值仍然是指向前一个头的指针。

你遇到了与Java非常普遍的混淆,并且相信我非常非常普遍(因此我在上面提到的SO上的2k upvotes)。我希望这能解决你的主要困惑!