双向链表:在前面添加一个节点。来自 geeksforgeeks(java 代码)

Posted

技术标签:

【中文标题】双向链表:在前面添加一个节点。来自 geeksforgeeks(java 代码)【英文标题】:Doubly linked list: adding a node at front. From geeksforgeeks (java code) 【发布时间】:2021-01-07 00:32:14 【问题描述】:

这是在双向链表前面添加一个节点的代码。我在这里不明白的是第 4 步。就在这里,在我看来,它将 new_Node 的地址存储到变量 head.prev 中。变量 head.prev 现在将保存新节点。这甚至没有意义,因为变量 'head' 也将包含 new_node。所以现在我们有两个变量指向同一个地址。

即使,在任何情况下,这段代码的意思是 new_node = head.prev,这也是没有意义的,因为此时 head.prev 将为空,然后 new_node 将指向空.

// 双向链表类 公共类 DLL 节点头; // 列表头

/* Doubly Linked list Node*/
class Node  
    int data; 
    Node prev; 
    Node next; 

    // Constructor to create a new node 
    // next and prev is by default initialized as null 
    Node(int d)  data = d;  
 
// Adding a node at the front of the list 
public void push(int new_data) 
 
/* 1. allocate node  
* 2. put in the data */
    Node new_Node = new Node(new_data); 

/* 3. Make next of new node as head and previous as NULL */
new_Node.next = head; 
new_Node.prev = null; 

/* 4. change prev of head node to new node */
    if (head != null) 
        head.prev = new_Node; 

/* 5. move the head to point to the new node */
    head = new_Node; 
 

【问题讨论】:

【参考方案1】:

需要第4步将旧头的prev连接到新头。

这是第3步之后的情况:

然后在第 4 步之后,旧头(为空)的prev 设置为指向新头:

然后第5步让head指向新节点(新的head):

【讨论】:

我完全明白了。昨天我其实明白了,但今天我再看一遍,并没有。我错误地将“head.prev”视为一个完整的变量名本身,而该变量是当前头节点下的“.prev”。拧我。你已经说得很清楚了,可以进一步理解。【参考方案2】:
public class DLL 

    private Node head;
    private Node tail;

    public void addFirst(int val) 
        Node node = new Node(val);

        if (head == null)
            tail = node;
        else 
            node.next = head;
            head.prev = node;
        

        head = node;
    

    public void addLast(int val) 
        Node node = new Node(val);

        if (tail == null)
            head = node;
        else 
            tail.next = node;
            node.prev = tail;
        

        tail = node;
    

    private static final class Node 

        private final int val;
        private Node prev;
        private Node next;

        public Node(int val) 
            this.val = val;
        
    

【讨论】:

【参考方案3】:

如果head.prev != nullhead 不是列表的第一个元素。这应该作为先决条件进行检查,并且应该抛出IllegalStateException。插入的进一步处理是没有意义的,因为必须恢复指向第一个位置的指针。

在第 3 步之后,new_node 设置完成,new_node 通过 new_node.next 单向链接到前者的第一个元素,现在是第二个元素 head。要完成双链接,必须将head.prev 设置为新的前任head。如果省略 if,这就是第 4 步的作用。

【讨论】:

以上是关于双向链表:在前面添加一个节点。来自 geeksforgeeks(java 代码)的主要内容,如果未能解决你的问题,请参考以下文章

Java中双向链表的代码实现

链表VS数组

双向链表

双向链表

带头节点的双向链表

双向链表