当前位置:   article > 正文

Leetcode24-两两交换链表中的节点详解_链表的排序两两交换是什么原理

链表的排序两两交换是什么原理

往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

Leetcode21-合并两个有序链表详解

Leetcode22-有效括号生成详解


目录

题目

示例

解析

迭代法

代码

Python代码

Java代码

迭代法

代码

Python代码

Java代码


题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

让我们分析一下题目:

已知:一个链表

目的:交换相邻两节点

要求:返回交换后的链表头节点

示例

示例1

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例2

输入:head = []
输出:[]

示例3

输入:head = [1]
输出:[1]

解析

迭代法

对于迭代法就是将链表从头到尾进行遍历,将链表中的相邻两节点进行两两交换了,但是这里要注意的时,在链表中我们变换的链表指针的指向,从而达到变换链表节点顺序的效果。

对于下图示例,将链表1—>2—>3—>1中相邻两节点进行两两交换,首先创建虚拟节点res,并将当前指针cur指向虚拟头结点,head指针指向第一个节点“1”,next指针指向第二个节点“2”,tmp指针指向第三个节点“3”

首先是交换节点“1”和节点“2”的顺序,断开节点“res”与节点“1”的指针,并将指针指向节点“2”

 断开节点“2”与节点“3”的指针,并将节点“2”指向节点“1”

将节点“1”指向节点“3”

至此,已经完成了第一节点和第二节点的交换

再进行第二次迭代,交换第三节点和第四节点,但此时cur指向节点“2”,head指向节点“1”,next指向节点“3”,tmp指第四节点“1”,然后再进行如上操作

 最终得到最后讲过全部交换后的链表

代码

Python代码

  1. class Solution:
  2. def swapPairs(self, head: ListNode) -> ListNode:
  3. # 对于空链表只有一个节点的链表,直接返回原链表
  4. if head == None or head.next == None:
  5. return head
  6. res = ListNode() # 创建虚拟头结点
  7. res.next = head # head指向第一个节点
  8. cur = res # cur指向虚拟节点
  9. while cur.next != None and cur.next.next != None:
  10. nxt = head.next # nxt指向第二节点
  11. tmp = nxt.next # tmp指向第三节点
  12. cur.next = nxt # 虚拟头节点指向第二节点
  13. nxt.next = head # 第二节点指向第一节点
  14. head.next = tmp # 第一节点指向第三节点
  15. cur = head # 准备第二次迭代, cur第一节点
  16. head = head.next # head指向第二节点
  17. return res.next # 返回交换后的链表,即虚拟头结点后的所有节点

Java代码

  1. class Solution {
  2. public ListNode swapPairs(ListNode head) {
  3. if(head == null || head.next == null){
  4. return head;
  5. }
  6. ListNode res = new ListNode(0);
  7. res.next = head;
  8. ListNode cur = res;
  9. while(cur.next != null && cur.next.next != null){
  10. ListNode next = head.next;
  11. ListNode tmp = head.next.next;
  12. cur.next = next;
  13. next.next = head;
  14. head.next = tmp;
  15. cur = head;
  16. head = head.next;
  17. }
  18. return res.next;
  19. }
  20. }

迭代法

将head指向第一节点“1”,将next指向第二节点“2”

将第一节点指向第三节点,同时第三第四节点进行递归,head指向第三节点,next指向第四节点

其中递归部分将第四节点指向第三节点

然后第二几点指向第一节点

 所以最终得到最后所有家电见后顺序后的链表

代码

Python代码

  1. class Solution:
  2. def swapPairs(self, head: ListNode) -> ListNode:
  3. # 对于空链表只有一个节点的链表,直接返回原链表
  4. if head == None or head.next == None:
  5. return head
  6. nxt = head.next
  7. head.next = self.swapPairs(head.next.next)
  8. nxt.next = head
  9. return nxt

Java代码

  1. class Solution {
  2. public ListNode swapPairs(ListNode head) {
  3. if(head == null || head.next == null){
  4. return head;
  5. }
  6. ListNode next = head.next;
  7. head.next = swapPairs(head.next.next);
  8. next.next = head;
  9. return next;
  10. }
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/思考机器4/article/detail/61225
推荐阅读
相关标签
  

闽ICP备14008679号