Leetcode024 两两交换链表中的节点 思路详解+Python实现

本人一直在努力地积累Leetcode上用Python实现的题,并且会尽力讲清每道题的原理,绝不像其他某些博客简略地带过。
如果觉得讲的清楚,欢迎关注。



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

示例:

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

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。




思路:这道题的思路很明朗。在我的代码中,我定义了一个函数负责翻转。我先遍历一遍指针算出一共有多少个元素。(但其实不知道也应该无所谓,在函数中设置异常捕捉也应该没事。),这是为了防止不小心翻转过界。那这道题最重要的逻辑就在于实现链表节点的交换。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        t = head
        if t is None:
            return None
        if t.next is None:
            return t
        #先反转第一第二个
        j = t.next
        q = j.next
        j.next = t
        t.next = q
        ans = j


        if t.next is None:
            return ans
        #因为是22翻转,所以应该保证上个节点的后2个节点不为None
        #我们要交换2个节点,最重要的是我们先要定位到这2个节点前面那个节点。
        while t.next.next is not None:
            j = t.next
            q = t.next.next
            j.next = q.next
            t.next = q
            q.next = j
            if t.next is None or t.next.next is None:
                return ans
            t = t.next.next
            if t is None or t.next is None:
                return ans
        return ans



反思总结:做了这么多链表题,最重要的是找到我们要改变区域的那一块的前面那个指针,因为这样才可以改变前面那个指针的next。但是由于在头部的节点没有前面的指针,所以我们要分情况讨论

猜你喜欢

转载自blog.csdn.net/weixin_41958153/article/details/80740919