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

如何在单链表中交换两个节点的内容?

陈瀚玥
2023-03-14

我在谷歌上搜索了这个,但他们都在谈论“交换节点而不交换数据”。

我尝试自己编写一个交换节点方法:

public void swapNodes(int num1, int num2) {

    if(num1 == num2) {
        return;
    }

    Node currentNum1 = head;
    Node currentNum2 = head;
    Node waitForSwap1 = null;
    Node waitForSwap2 = null;
    while (currentNum1 != null) {
        if (currentNum1.data == num1) {
            waitForSwap1 = currentNum1;
            System.out.println();
            System.out.println("waitForSwap 1");
            System.out.println(waitForSwap1.data);

        }
        currentNum1 = currentNum1.next;
    }

    while (currentNum2 != null) {
        if (currentNum2.data == num2) {
            waitForSwap2 = currentNum2;
            System.out.println("waitForSwap 2");
            System.out.println(waitForSwap2.data);

        }
        currentNum2 = currentNum2.next;
    }

    currentNum1 = waitForSwap2;
    currentNum2 = waitForSwap1;

    System.out.println("currentNum1");
    System.out.println(currentNum1.data);

    System.out.println("currentNum2");
    System.out.println(currentNum2.data);
}

如您所见,currentnum1currentnum2相互更改,但打印结果不交换。如何交换两个节点及其数据

编辑:下面的完整示例

public class Node {

public int data;
public Node next;

public Node(int _data) {
    this.data = _data;
    this.next = null;
}

public String toString() {
    return (Integer.toString(data));
}
}
public class LinkedList {

Node head;

public void Insert(int data) {
    Node node = new Node(data);

    if (head == null) {
        head = node;
    } else {
        Node n = head;
        while (n.next != null) {
            n = n.next;
        }
        n.next = node;
    }
}

public void ShowList() {
    Node node = head;
    while (node != null) {
        System.out.print(node.data + " ");
        node = node.next;
    }
}

public void swapNodes(int num1, int num2) {

    if (num1 == num2) {
        return;
    }

    Node currentNum1 = head;
    Node currentNum2 = head;
    Node waitForSwap1 = null;
    Node waitForSwap2 = null;
    while (currentNum1 != null) {
        if (currentNum1.data == num1) {
            waitForSwap1 = currentNum1;
            System.out.println();
            System.out.println("waitForSwap 1");
            System.out.println(waitForSwap1.data);

        }
        currentNum1 = currentNum1.next;
    }

    while (currentNum2 != null) {
        if (currentNum2.data == num2) {
            waitForSwap2 = currentNum2;
            System.out.println("waitForSwap 2");
            System.out.println(waitForSwap2.data);

        }
        currentNum2 = currentNum2.next;
    }

    currentNum1 = waitForSwap2;
    currentNum2 = waitForSwap1;

    System.out.println("currentNum1");
    System.out.println(currentNum1.data);

    System.out.println("currentNum2");
    System.out.println(currentNum2.data);
}
}
public class Runner {

public static void main(String[] args) {
    LinkedList lkdList = new LinkedList();

    lkdList.Insert(10);
    lkdList.Insert(9);
    lkdList.Insert(15);
    lkdList.Insert(2);
    lkdList.Insert(73);

    lkdList.ShowList();

    lkdList.swapNodes(10, 2);

    System.out.println();
    System.out.println("After Swap");

    lkdList.ShowList();
}

}

共有1个答案

酆阳煦
2023-03-14

好的,如果您只想交换数据,而不是节点,这里是:

  public void swapNodes(int num1, int num2) {

    if (num1 == num2) {
      return;
    }

    Node node1 = null;
    Node node2 = null;

    Node cur = head;
    while(cur != null) {
      if (num1 == cur.data) {
        node1 = cur;
      }
      if (num2 == cur.data) {
        node2 = cur;
      }
      cur = cur.next;
    }

    if (node1 == null || node2 == null)
      return;

    int tmp = node1.data;
    node1.data = node2.data;
    node2.data = tmp;
  }
 类似资料:
  • 大家好,我正在尝试在两个双链接列表之间完全交换两个节点(值和地址也是)。只有位于相同位置的节点才能在两个节点之间交换,即位置2的节点只能由另一个LinkedList中位置2的节点交换。考虑下面的2个链接列表示例: 假设我们想交换第三个元素,即162和830。交换后,领英列表变成: 我已经尝试了下面的代码,但它不能替换前面的元素。 我怎样才能完成这项任务? elseif不交换前面的元素,例如,如果我

  • 我在Java中实现一个双链接列表时遇到了一个问题。特别是要交换2个以下节点(在我的例子中,一个节点包含一个政治候选人)。 假设下面的DLL: head- 作为输出,我没有从头到尾的正确DLL,但从头到尾都很好: 我已经写了几个版本的这个方法reverseTwoNode。我甚至尝试在节点内部交换数据,而不是交换节点,我也有同样的问题。你能帮我真是太好了,我花了这么多时间在这个简单的功能上,我看不出有

  • 024. Swap Nodes in Pairs[E] 题目 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should us

  • 我遇到了一个问题,在这个问题中,您应该交换双链接列表中的一组节点。例如:对于列表

  • 我试图解决leetcode中的一个问题—从BST中删除节点。我们将获得BST的根节点和密钥;我们必须删除以该键为值的节点。我们可以假设所有树节点都有唯一的值。我们必须在此操作后返回根节点。(问题链接为:https://leetcode.com/problems/delete-node-in-a-bst/description/). 我编写了以下代码: 我想知道为什么评论下面的行实际上并没有改变根节