本人一直在努力地积累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。但是由于在头部的节点没有前面的指针,所以我们要分情况讨论