交换链表Java中的两个相邻节点

时间:2018-07-12 19:03:44

标签: java list nodes

我有一个非常琐碎的问题,应该只是更改链接而已。我已经阅读了一些答案,有些显示了如何通过交换数据来做到这一点,还有一些对此概念进行了模糊的解释。

这似乎使我无所适从。当我将目标节点交换到上一个节点时,该节点将被跳过。然后,当我返回引用下一个节点时,我陷入了一个永恒的循环。我需要知道是否需要从头开始遍历另一个节点,或者是否可以简单地引用新链接。我知道我缺少明显的东西。

for (cursor = head; cursor != null; cursor = cursor.link) {
  if (target == cursor.data) {
    Target = cursor.link.getLink();
    next = cursor.getLink();
    prev = cursor;
    System.out.println(prev.getData()); // for testing
    System.out.println(next.getData());
    prev.setLink(Target); // Swaps the first link
    //Target.setLink(prev); // causes eternal loop
  }}
  return Target.getData();
}

这是我的测试方法,创建7个节点的列表,然后打印到屏幕上。

public static void main(String[] args) {
  SLL LL = new SLL(18, null);

  LL.add(4);
  LL.add(14);
  LL.add(8);
  LL.add(12);
  LL.add(2);
  LL.add(28);
  System.out.println(LL.toString());
  System.out.println(LL.swap(12));
  System.out.println(LL.toString());
}

这是我得到的输出:

  

{18,28,2,12,12,8,14,4}

     

12

     

8

     

14

     

{18,28,2,12,12,4}

所需的输出为:

  

{18,28,2,12,12,8,14,4}

     

{18、28、2、8、12、14、4}

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试将特定节点(由节点的值确定)与后面的节点交换?。

您提出的问题的最简单解决方案是仅交换值,而不是尝试交换节点。

由于您正在处理基本体,因此类似的事情应该起作用

if(currNode.value() == targetValue) {
   Node nextNode = currentNode.next();
   currentNode.setValue(nextNode.getValue()); //set the current node's value to the next node's value
   nextNode.setValue(targetValue);
}

只需确保处理您的目标值在列表的最后一个节点中的情况。

编辑-由于出于某种原因您想更改链接,因此一般逻辑是-

  • 跟踪3个节点:上一个,当前,下一个
  • 设置上一个链接=下一个
  • 设置current.link = next.link
  • 设置next.link =当前