双链表:在前面添加一个节点从geeksforgeeksjava代码

问题描述

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

即使在任何情况下,该代码的意思是new_node = head.prev,也没有意义,因为在这一点上head.prev将为null,然后new_node将指向null

//双链表类 公共类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; 
} 

}

解决方法

需要执行步骤4,将旧磁头的prev连接到新磁头。

这是步骤3之后的情况:

after step 3

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

after step 4

然后第5步将头指向新节点(新头):

after step 5

,

如果head.prev != null,则head不是列表的第一个元素。这应该作为前提进行检查,并且应该抛出IllegalStateException。插入的进一步处理毫无意义,因为必须恢复指向第一位置的指针。

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

,
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;
        }
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...