两两交换其中相邻的节点
LeetCode 24. 两两交换链表中的节点(Swap Nodes in Pairs)
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
C++实现
1、迭代实现 C++
两两交换其中相邻的节点(Swap Nodes in Pairs) C++ 迭代实现
/*
* @author:leacoder
* @des: 迭代实现 两两交换链表中的节点
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
/*在头节点前 新建一节点,其next指向head。好处 将[]\[1]这种特殊情况能够统一处理*/
ListNode *virtualnode = new ListNode(0);
virtualnode->next = head;
ListNode *node = virtualnode;//存储新的开始节点
while(head&&head->next){
ListNode *tmp = head->next;//不变的
head->next = tmp->next;
tmp->next = head;//交换
node->next = tmp;
node = head;
head = node->next;//下移
}
return virtualnode->next;
}
};
2、递归实现 C++
两两交换其中相邻的节点(Swap Nodes in Pairs) C++ 递归实现
/**
* @author:leacoder
* @des: 递归实现 两两交换链表中的节点
*/
class Solution {
public:
//每两个节点为一组 反转前的前节点(反转后的 后节点)、反转前的后节点(反转后的 前节点)
//下一组 为 反转前的后节点(反转后的 前节点)的 next 以及 next.next
ListNode* swapPairs(ListNode* head) { //入参 反转前的前节点(反转后的 后节点)
////传入的参数的合法性,递归的终止条件
if (NULL==head || NULL==head->next)
return head;
ListNode *res = head->next; //记录 反转前的后节点(反转后的 前节点)
head->next = swapPairs(res->next); //更新 反转后的 后节点 的next 为下一组 反转后的 前节点 (入参为反转前的后节点的next 即为下一组的 反转前的前节点(反转后的 后节点)
res->next = head; //更新 反转后的 前节点的next 为 反转前 的 前节点
return res;
}
};
以【A B C D】为例,那么可分为2组【A B】【C D】递归到最后一层非head->next = NULL那层, ListNode* swapPairs(ListNode* head){}中head为C,head->next为D。 那么就有:
·【C D】组 此时 head 为 C 交换前
ListNode *res = head->next; //D
head->next = swapPairs(res->next); //C->next = D->next=NULL 入参为D->next NULL值跳出递归 返回入参
res->next = head; //D->next = C
return res; //D
此时结果为 【A B D C】
·【A B】组 此时 head 为 A 交换前
ListNode *res = head->next; //B
head->next = D //上次迭代返回值 swapPairs(C)
res->next = head; //B->next = A
return res; //B
此时结果为 【B A D C】
其他情况可同上分析
Java实现
Java实现逻辑上与C++无区别
1、迭代实现 Java
两两交换其中相邻的节点(Swap Nodes in Pairs) Java 迭代实现
2、递归实现 Java
两两交换其中相邻的节点(Swap Nodes in Pairs) Java 递归实现
Python3 实现
两两交换其中相邻的节点(Swap Nodes in Pairs) Py3 迭代实现
#@author:leacoder
#@des: 循环实现 多元赋值
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
pre,pre.next = self,head #在头节点前 新建一节点pre,其next指向head
while pre.next and pre.next.next:
a = pre.next
b = a.next
pre.next,b.next,a.next = b,a,b.next
pre = a
return self.next
实现逻辑 与 C++、Java 无差别,但是采用了多元赋值
GitHub链接: https://github.com/lichangke/LeetCode
个人Blog: https://lichangke.github.io/
欢迎大家来一起交流学习