LeetCode 24. 两两交换链表中的节点

题目


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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

思路

这个思路其实就是两两交换,要熟悉链表的特性,它的每个节点就相当于一个指针,指向下一个节点。

方法一:

利用递归。

交换第二节点的next节点指向递归头节点。

第二节点的next节点指向第一节点,返回第二节点,这样第一节点的下一节点就为交换后的节点。

最后第二节点的next节点指向第一节点,即为需要的交换后的node

class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next:
            return  head
        temp1 = head
        temp2 = head.next
        temp1.next = self.swapPairs(temp2.next)
        temp2.next =temp1
        return temp2 

方法二:

利用迭代。

这里记录一个大大比较牛的做法,将该类别的题目设一个条件key来trigger,本题是两两交换,target 设2,其他同理。

思路很清晰,构造一个主node,一个临时node 来存取中间节点的变化。

class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        l1 = ListNode(-1)
        target = 2
        p = l1
        count = 0
        while head and count < target:
            q = head
            head = head.next
            q.next = p.next
            p.next = q  #将首节点的val赋值给临时node p,下一次循环进来就可以与q两两交换
            count += 1
            if count == target: #target相等,意味着达到交换次数,临时node p赋值空(只保留一位节点)
                while p.next:
                    p = p.next
                count = 0
        return l1.next
原文地址:https://www.cnblogs.com/xiaoqiangink/p/13947252.html