链表4:两两交换链表中的节点(24)
本题如下:(链接:https://leetcode.cn/problems/swap-nodes-in-pairs/submissions/)
题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

思路:
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。
接下来就是交换相邻两个元素了,在这个环节建议画图,如果不画图,操作多个指针很容易乱,也很难搞清楚操作的先后顺序。
初始时,cur指向虚拟头结点,然后进行如下三步:

操作之后,链表如下:

更加直观的图可以看下面这个:

这样我们就可以写出相应的C++代码:
1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点 5 dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 6 ListNode* cur = dummyHead; 7 while(cur->next != nullptr && cur->next->next != nullptr) { 8 ListNode* tmp = cur->next; // 记录临时节点 9 ListNode* tmp1 = cur->next->next->next; // 记录临时节点 10 11 cur->next = cur->next->next; // 步骤一 12 cur->next->next = tmp; // 步骤二 13 cur->next->next->next = tmp1; // 步骤三 14 15 cur = cur->next->next; // cur移动两位,准备下一轮交换 16 } 17 return dummyHead->next; 18 } 19 };
其中,时间复杂度为:O(n),空间复杂度为:O(1)。
接下来给出使用Java的两种方法:
1 // 递归版本 2 class Solution { 3 public ListNode swapPairs(ListNode head) { 4 // base case 退出提交 5 if(head == null || head.next == null) return head; 6 // 获取当前节点的下一个节点 7 ListNode next = head.next; 8 // 进行递归 9 ListNode newNode = swapPairs(next.next); 10 // 这里进行交换 11 next.next = head; 12 head.next = newNode; 13 14 return next; 15 } 16 }
1 // 虚拟头结点 2 class Solution { 3 public ListNode swapPairs(ListNode head) { 4 5 ListNode dummyNode = new ListNode(0); 6 dummyNode.next = head; 7 ListNode prev = dummyNode; 8 9 while (prev.next != null && prev.next.next != null) { 10 ListNode temp = head.next.next; // 缓存 next 11 prev.next = head.next; // 将 prev 的 next 改为 head 的 next 12 head.next.next = head; // 将 head.next(prev.next) 的next,指向 head 13 head.next = temp; // 将head 的 next 接上缓存的temp 14 prev = head; // 步进1位 15 head = head.next; // 步进1位 16 } 17 return dummyNode.next; 18 } 19 }
本文来自博客园,作者:Ricentch,转载请注明原文链接:https://www.cnblogs.com/cnwsh/p/16575517.html

浙公网安备 33010602011771号