当前位置: 首页 > 知识库问答 >
问题:

指向先前节点的Java双链接列表指针

桑博远
2023-03-14

我正在制作一个方法,将一个节点添加到名为“publicvoidadd(int-index,T-value)”的列表中。

此方法将把一个值放入索引中,然后将有指向列表中下一个和上一个元素的指针。我把指向前面节点的指针搞砸了,我一直坐在那里进行实验,但没有让它工作。

示例:我们有一个包含整数值[2,4,6]实例变量的列表:Node head、tail;整数金额,变动;

内部类的实例变量为:T值;节点prev,next;

输入:

add(1, 3);
System.out.println(list.toString());
System.out.println(list.backwardsString());

预期产出:

[2, 3, 4, 6]
[6, 4, 3, 2]

到目前为止,我的代码是:

public void add(int index, T value) {
if (index < 0 || index > amount) {
        throw new IndexOutOfBoundsException("Index is not between 0 and amount!");
    }

    if (value== null) {
        throw new NullPointerException("Value can't be null!");
    }

    if (amount == 0) {
        head = tail= new Node<>(value, null, null);
    }
    else if (index == 0) {
        head = head.prev= new Node<>(value, null, head);
    }
    else if (index == amount) {
        tail = tail.next= new Node<>(value, tail, null);
    } 
    else {
        Node<T> p = head;  
        for (int i = 1; i < index; i++) {
            p = p.next;
        }
        p.next= new Node<>(value, p, p.next);


        p = tail;
        for (int i = amount; i > index; i--) {
            p.prev= new Node<>(value, p.prev, p);
            p = p.prev;
        }*/
    }

    amount++;
    changes++;
}

在这个场合,我也会问你

p、 上。下一个或下一个。上

工作

共有1个答案

彭博厚
2023-03-14

通过在List类中引入一个空的伪节点,可以大大简化设计。

由于此节点始终存在,因此不需要以下特殊情况:

if (amount == 0) {
    head = tail= new Node<>(value, null, null);
}
else if (index == 0) {
    head = head.prev= new Node<>(value, null, head);
}

第一个伪节点可以用

pseudo.next = pseudo;
pseudo.prev = pseudo;

列表是空的,如果

pseudo.next == pseudo.prev

真正的列表开始将pseudo.next,最后一个列表条目将pseudo.prev.所以你的列表实际上是一个环。

您的搜索循环将变为

   Node<T> p = pseudo.next;  
   for (int i = 0; i < index && p!=pseudo; i++) {
        p = p.next;
   }

然而,在这里:

   p.next= new Node<>(value, p, p.next);

下一步你必须操纵p。prev,它还指向(或更好地指)非法节点

但我把它作为家庭作业——这显然是;-)

编辑:

演示前哨节点的完整列表实现

公共班级名单{

public class  Node {
    T value = null;
    Node(T v) {
        value=v;
    }
    Node()   {
    }
    public Node getNext() {
        return next;
    }

    public Node getPrev () {
        return prev;
    }
    public T getValue() {
        return value;
    }

    Node prev = null;
    Node next = null;
};

private Node pseudo = new Node();

List() {
    pseudo.next = pseudo.prev = pseudo;
}

public Node getBegin() {
    return pseudo.next;
}

public Node getEnd() {
    return pseudo;
}

public boolean add(int index, T value) {
    Node p = pseudo.next;

    for (int i = 0; i < index && p!=pseudo; i++) {
        p = p.next;
    }

    // Correct for tail insertion
    if(p == getEnd())
        p = p.prev;

    Node ptm = p.next;

    p.next      = new Node(value);
    p.next.next = ptm;
    p.next.prev = p;
    ptm.prev    = p.next;

    return true;
}

public void delete(int i) {

    Node p = pseudo.next;

    for (int ix = 0; ix < i && p!=pseudo; ix++) {
        p = p.next;
    }

    if(p != getEnd()) {
        Node ptm = p.prev;
        p.prev.next = p.next;
        p.next.prev = ptm;
    }       
}

}

 类似资料:
  • 我的双链表有两个虚拟节点,头部和尾部。函数对我来说非常适合,但是当我尝试使用与相同的算法时,它会一直为我打印虚拟节点。为什么会这样? 预期结果: 我的结果:

  • 问题内容: 我正在O(1)将n个条目推入Java 。 我想在以后的O(1)删除一些独特的项目。 我虽然要保留指向“”的唯一节点的数组,以便稍后再删除它们。 有没有办法在其他任何Java类上执行此操作? 我尝试将迭代器存储到项目。这样我就可以使用。但我知道当时列表上只能有一个迭代器。 我知道一个简单的解决方案可以自己实现链接列表。但是我宁愿使用或已经实施的其他一些Java类。 问题答案: Java

  • 我目前正在尝试使用C语言中的单链表。我编写了一个函数来创建一个节点,并编写了一个函数来打印所有节点-看起来如下: 输出正确: 现在我想写一个函数,用于创建一个新的节点,我把我的代码改成这样: 编译后,我首先得到这个警告消息: 输出如下所示: 它只显示节点,我猜指向(例如

  • 我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。 这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。 第77行=位置next=n; 第69行=插入后(head.prev, x); 第18行=mList。镶片(k

  • 该方法不起作用: 另一种有效的添加方法: 要调试的打印方法: DoublyLinkedList类: LinkedList和Node的实现非常简单,https://www.geeksforgeeks.org/doubly-linked-list/ 我首先创建一个link列表,insert_front()一个值来使头不为空,然后使用上面的方法插入其他东西。插入节点后的前端、结尾,但是,这个insert