题目

类型:Linked List

难度:中等

两两交换链表中的节点 - 图1

解题思路

通过迭代的方式实现.

1、创建哑结点 dummyHead,令 dummyHead.next = headtemp 表示当前到达的节点,初始时temp = dummyHead。每次需要交换 temp 后面的两个节点。

2、如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1node2,通过更新节点的指针关系实现两两交换节点。

具体而言,交换之前的节点关系是 temp -> node1 -> node2,交换之后的节点关系要变成 temp -> node2 -> node1,因此需要进行如下操作。

  1. temp.next = node2
  2. node1.next = node2.next
  3. node2.next = node1

完成上述操作之后,节点关系即变成 temp -> node2 -> node1。再令 temp = node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。

两两交换链表中的节点之后,新的链表的头节点是 dummyHead.next,返回新的链表的头节点即可。

代码

  1. class Solution {
  2. public ListNode swapPairs(ListNode head) {
  3. ListNode dummyHead = new ListNode(0);
  4. dummyHead.next = head;
  5. ListNode temp = dummyHead;
  6. while (temp.next != null && temp.next.next != null) {
  7. ListNode node1 = temp.next;
  8. ListNode node2 = temp.next.next;
  9. temp.next = node2;
  10. node1.next = node2.next;
  11. node2.next = node1;
  12. temp = node1;
  13. }
  14. return dummyHead.next;
  15. }
  16. }