24、两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

递归

  • 找终止条件:本题终止条件很明显,当递归到链表为空或者链表只剩一个元素的时候,没得交换了,自然就终止了。
  • 找返回值:返回给上一层递归的值应该是已经交换完成后的子链表。
  • 单次的过程:因为递归是重复做一样的事情,所以从宏观上考虑,只用考虑某一步是怎么完成的。我们假设待交换的俩节点分别为head和next,next的应该接受上一级返回的子链表(参考第2步)。就相当于是一个含三个节点的链表交换前两个节点,就很简单了,想不明白的画画图就ok。
# @lc code=start
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        # 终止条件 
        if head==None or head.next==None:
            return head 
        # 相当于含三个节点的链表交换前两个 
        # prob指向第二个节点
        prob = head.next 
        # 第一个节点要跳过第二个节点指向后面 
        head.next = self.swapPairs(prob.next)
        # 第二个节点指向第一个节点
        prob.next = head 
        return prob 

非递归
双指针

class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        new_list = ListNode(-1) # 添加一个哑结点
        new_list.next = head 
        prob = new_list 
        while prob.next!=None and prob.next.next!=None:
            start = prob.next 
            end = prob.next.next 
            prob.next = end 
            # print(prob)
            # print(start)
            # print(end)
            # 将相邻两数互换,先将start的next换为end的next,再把start接在end后面,完成互换
            start.next = end.next
            end.next = start
            # print(start)
            
            prob = start

        return new_list.next

你可能感兴趣的:(数据结构,leetcode)