了解Java

时间:2016-02-23 23:28:45

标签: java nodes doubly-linked-list

澄清:主要问题是哪个节点类似于current.previous.next = current.next实际指向?

我正在使用我在YouTube视频中找到的一些示例代码,但我真的试图将其分解并理解它。一切都按原样运作,我在每个部分都添加了评论以帮助我理解。我真正遇到的问题是,当代码在同一行开始使用上一个和下一个时,解释正常英语发生的情况是节点删除。我并没有完全遵循它现在指向的内容。我已经完成了调试器中的代码,但如果有人不介意,我需要一些简单的英语解释。

比方说,我有一个有3,4,5,6,7的DLL。所以我要删除5,这是第3个索引。这是删除方法。

//Method to remove node at a specified position
public void removeAt(int index) {

    //If the head doesn't exist, break out of the logic
    if(head == null) return;

    //If the requested index is smaller than 1 or greater 
    //than the size of the list, break out.

    if(index < 1 || index > size) return;

    //Declares the currently used link as the head
    Link current = head;

    //Declare int i counter for use in while loop
    //While i is less than the index set current to the next node
    //and add to the counter i
    int i = 1;
    while(i < index) {
        current = current.next;
        i++;
    }

    //If the next node doesn't exist, set current...previous next?
    if(current.next == null) {
        current.previous.next = null;

    }

    //Else if the node before the current is null, set current to
    //the next node and then set the previous to null (I thought it
    //already was null??) Set the head to the current node
    else if(current.previous == null) {
        current = current.next;
        current.previous = null;
        head = current;
    }

    //If none of the above conditions, set current previous next?? to
    //the next node and current next previous to the previous node??
    else {
        current.previous.next = current.next;
        current.next.previous = current.previous;
    }

    //Subtract from the size of the list
    size--;


}

当我开始使用current.previous.next和current.next.previous时,我的主要理解问题就出现了。对我来说,current.previous.next只是说要保持最新状态。如果我有三个数字,3 4 5和当前是4,那么之前是3,所以接下来只会回到4.我知道这不对,但在阅读其他帖子后,Javadoc和观看视频,我仍然不明白发生了什么。

这是另一个类:

public class Link {

    private int data;
    public Link previous;
    public Link next;

    public Link(int data) {
        previous = null;
        this.data = data;
        next = null;
    }

    public Link(Link previous, int data, Link next) {
        this.previous = previous;
        this.data = data;
        this.next = next;

    }

    public int Data() {
        return data;
    }


}

我很感激一些解释。谢谢!

2 个答案:

答案 0 :(得分:0)

如果node.next为null,则表示该节点是列表的最后一个元素。因此,如果您尝试删除列表的最后一个元素,则最后一个元素之前的元素将成为最后一个元素。这是代码的作用

if(current.next == null) {
    current.previous.next = null;

}

如果node.previous为null,则表示它是列表的第一个元素。首先,我们必须保持对以下元素的引用,定义以下元素不能具有前一个元素,然后将其定义为列表的头部。这是代码的作用

if(current.previous == null) {
    current = current.next;
    current.previous = null;
    head = current;
}

然后继续你的榜样 如果current为4,则current.previous为3,current.next为5 所以

current.previous.next = current.next

定义3.next现在为5

current.next.previous = current.previous

定义5.previous现在是3

因此,列表中的4不再是引用

答案 1 :(得分:0)

Doubly link list(DLL)是一个可以在您已知的两个方向上遍历的列表。每个节点都有前一个和下一个指向其兄弟节点的指针,允许导航到两个方向。您已经有head变量指向链表的头部。

您在要删除的节点的索引中传递的remove方法。

while(i < index) {
    current = current.next;
    i++;
}

while while循环将current节点设置为我们要删除的节点。此时有三种情况需要处理。

  1. 当前节点可以是列表中的第一个节点。因此,current.previous指向任何内容,current.next可能指向下一个节点(如果有)。
  2. 当前节点可以是列表的最后一个节点,以便current.next = null。
  3. 当前节点既不是列表的头部也不是尾部,因此current.nextcurrent.previous具有相应的值。

     if(current.next == null) {
       current.previous.next = null;
     }
    
  4. 上面的代码部分将是上面提到的第二点。 current指向最后一个节点。要删除最后一个节点,您必须返回current.previous并将其链接设置为null,以便current节点无法再访问previous

     else if(current.previous == null) {
        current = current.next;
        current.previous = null;
        head = current;
    }
    

    检查当前节点是否是节点的头部。如果current指向链接列表的头部,则它没有任何先前的兄弟,因此current.previous指向null。所以current.next必须成为列表的新头。使用current.previous = null我们将previous链接设置为null,并将此current头设置为head变量。现在上一个节点已经消失。没有引用它。

    第三种情况是上述要点3.由

    处理
    else {
        current.previous.next = current.next;
        current.next.previous = current.previous;
    }
    

    我们要删除current节点的位置。这意味着我们需要将current.previouscurrent.next链接为兄弟姐妹。

    最后一点,您的Link课程使用公共字段。它们应该是私有的,并通过getter和setter访问。