链表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 }

 

 

 

posted @ 2022-08-11 11:39  Ricentch  阅读(39)  评论(0)    收藏  举报