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

LinkedList addAfter方法不更新下一个节点上一个成员变量

华建同
2023-03-14

我正在尝试构建一个具有addAfter方法的链接列表。出于某种原因,add方法将插入一个新节点,但它不会更新下一个节点之前的成员变量。这是我的输出。注意,在第二个列表中,“先前”输出之一不正确。如何修复addafter方法?

public class DoubleLinkedList<E> implements List211<E> {
    private static class DLinkedNode<E> {
        private E data;
        private DLinkedNode<E> next = null;
        private DLinkedNode<E> prev = null;

        private DLinkedNode(E dataItem) {
            data = dataItem;
        }

        private DLinkedNode(E dataItem, DLinkedNode<E> nextNodeRef,
                DLinkedNode<E> prevNodeRef) {
            data = dataItem;
            next = nextNodeRef;
            prev = prevNodeRef;
        }

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

        public void setPrev(DLinkedNode<E> prev) {
            this.prev = prev;
        }
    }

    private DLinkedNode<E> head = null;
    private DLinkedNode<E> tail = null;
    private int size;

    // http://codereview.stackexchange.com/questions/63171/implementation-of-a-doubly-linked-list-in-java
    public void addFirst(E item) {

        DLinkedNode<E> newNode = new DLinkedNode<E>(item);
        if (size < 1) {
            newNode.next = null;
            newNode.prev = null;
            head = newNode;
            tail = newNode;

        } else {
            head.prev = newNode;
            newNode.next = head;
            newNode.prev = null;
            head = newNode;
        }
        size++;
    }


    private void addAfter(DLinkedNode<E> node, E item) {
        //WHAT AM I DOING WRONG
        DLinkedNode<E> newNode = new DLinkedNode<E>(item, node.next, node);
        node.next = newNode;
        //node.next.next = newNode; (maybe?)
        if (node == tail) { 
          tail = newNode;
        }
        size++;
    }

    private E removeAfter(DLinkedNode<E> node) {
        DLinkedNode<E> tempNext = node.next;
        if (tempNext != null) {
            node.next = tempNext.next;
            node.next.prev = node;
            size--;
            return tempNext.data;
        } else {
            return null;
        }
    }

    private E removeFirst() {
        DLinkedNode<E> temp = head;
        if (head != null) {
            head = head.next;
            head.prev = null;
        }
        if (temp != null) {
            size--;
            return temp.data;
        } else {
            return null;
        }
    }

    public String toString() {
        DLinkedNode<String> nodeRef = (DLinkedNode<String>) head;
        StringBuilder result = new StringBuilder();
        while (nodeRef != null) {
            result.append(nodeRef.data);
            if (nodeRef.next != null) {
                result.append(" ==> ");
            }
            nodeRef = nodeRef.next;
        }
        return result.toString();
    }

    private DLinkedNode<E> getNode(int index) {
        DLinkedNode<E> node = head;
        for (int i = 0; i < index && node != null; i++) {
            node = node.next;
        }
        return node;
    }

    public E get(int index) {
        checkBounds(index);
        DLinkedNode<E> node = getNode(index);
        return node.data;
    }

    public E set(int index, E newValue) {
        DLinkedNode<E> node = getNode(index);
        E result = node.data;
        node.data = newValue;
        return result;
    }

    private void checkBounds(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(Integer.toString(index));
        }
    }

    public void add(int index, E item) {
        checkBounds(index);
        if (index == 0) {
            addFirst(item);

        } else {
            DLinkedNode<E> node = getNode(index - 1);
            addAfter(node, item);

        }
    }

    public boolean add(E item) {
        add(size, item);
        return true;
    }

    @Override
    public E remove(int index) {
        checkBounds(index);
        if (index == 0) {
            this.removeFirst();
        } else {
            DLinkedNode<E> myNode = getNode(index - 1);
            return removeAfter(myNode);
        }

        return null;
    }

    @Override
    public int size() {
        return size;
    }

    public void printLinkedList() {
        System.out.print(this.getClass().getSimpleName() + ": ");
        DLinkedNode<E> myNode = head;
        for (int i = 0; i < size && myNode != null; i++) {
            if (i == size - 1) {
                System.out.print(myNode.toString() + " [next: " + myNode.next
                        + ", previous:" + myNode.prev + "] ");
            } else {
                System.out.print(myNode.toString() + " [next: " + myNode.next
                        + ", previous:" + myNode.prev + "] " + ", ");
            }
            myNode = myNode.next;
        }
    }
}

以下是我的主要方法:

public class MainTester {    
    public static void main(String[] args) {
        DoubleLinkedList myList = new DoubleLinkedList();
        double one = 1.0;
        double two = 2.0;
        double three = 3.0;
        double four = 4.0;
        double five = 5.0;
        double six = 6.0;
        myList.addFirst(one);
        myList.add(two);
        myList.add(three);
        myList.add(four);
        myList.add(five);
        myList.add(six);
        myList.printLinkedList();           

        System.out.println("\n\n");
        myList.add(1,45.0);
        myList.printLinkedList();

        /*
        System.out.println("\n\n");
        myList.add(2, three);
        myList.printLinkedList();
        */
    }
}

这是我的输出:

DoubleLinkedList:1.0[下一个:2.0,上一个:空],2.0[下一个:3.0,上一个:1.0],3.0[下一个:4.0,上一个:2.0],4.0[下一个:5.0,上一个:3.0],5.0[下一个:6.0,上一个:4.0],6.0[下一个:空,上一个:5.0]

DoubleLinkedList:1.0[下一个:45.0,上一个:空],45.0[下一个:2.0,上一个:1.0],2.0[下一个:3.0,上一个:1.0],3.0[下一个:4.0,上一个:2.0],4.0[下一个:5.0,上一个:3.0],5.0[下一个:6.0,上一个:4.0],6.0[下一个:空,上一个:5.0]

共有1个答案

柴泰平
2023-03-14
DLinkedNode<E> newNode = new DLinkedNode<E>(item, node.next, node);
if (node.next != null)
   node.next.prev = newNode;
newNode.next = node.next;
node.next = newNode;
newNode.prev = node;

这应该得到所需的顺序。尝试绘制/可视化-有助于对语句进行排序。

 类似资料:
  • 完成了教程-历史 的学习之后, 我们来到 my-hello [仓库]里面,就是我们在 教程-克隆中 [克隆] 得到的。 在 Mercurial 开发实践中一个好的做法是把每个变更隔离在各自的仓库里。这样可以避免把不相关的代码混杂起来, 并且便于一个接一个的测试每一部分工作。我们现在就开始采用这一模式。 我们的目标很简单,让“hello, world”程序打印另外一行输出。 首先, 我们给这个小项目

  • 问题内容: 我在地图操作中使用a 作为共享计数器。但是似乎我没有正确使用它,因为工作节点上计数器的状态没有更新。这是我的柜台类的样子: 据我了解的文档,当应用程序在多个工作程序节点中运行时,这应该可以正常工作: 累加器是仅通过关联和交换操作“累加”的变量,因此可以有效地并行支持。它们可用于实现计数器(如在MapReduce中)或总和。Spark本身支持数字类型的累加器,程序员可以添加对新类型的支持

  • 问题内容: 如何转换成? 还给我一个。 问题答案: 调用toArray()之后,您可以将结果传递到Apache Commons toPrimitive方法中: http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/ArrayUtils.html#toPrimitive(java.lang.Byte [])

  • 我有一个模板类,其中每个模板参数代表内部计算可以处理的一种类型的值。需要模板(而不是函数重载),因为值被作为::any传递,并且它们的类型在运行时之前不清楚。 为了正确地转换为正确的类型,我希望每个变量参数类型都有一个成员列表,类似于这样: 或者,我想将模板参数类型存储在一个列表中,以便对其进行RTTI处理(?)。但如何将它们保存在std::initializer\u列表成员中,我也不清楚。 谢谢

  • 我已经在节点(node1)上的pod(pod1)上部署了一个Spring Boot应用程序。我还在不同节点(node2)上的另一个pod(pod2)上部署了JMeter。我试图从POD2执行自动负载测试。为了执行负载测试,我要求为每个测试用例重新启动pod1。如何从POD2重新启动pod1?