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