反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
用一个变量来保存当前节点的next指针,next_node
用一个变量来保存前一个节点, prev
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, prev = head, None
next_node = None
while cur:
next_node = cur.next
cur.next = prev
prev = cur
cur = next_node
return prev
这个代码可以使用python独有的多变量赋值进行化简
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, prev = head, None
while cur:
cur.next, prev, cur = prev, cur, cur.next
return prev
这里注意别踩坑,a, b, c = 1, 2, 3,其执行顺序:
先执行等号右边的表达式,再依次将值赋给左边,Python解释器会将其组成为一个tuple,赋值的时候再unpack。
>>> a, b = 2, 0
>>> a, b, a = 1, a, 4
>>> a, b
(4, 2)
cur.next, prev, cur = prev, cur, cur.next
不能与下面这段代码等价,因为它会丢失cur.next的节点
cur.next = prev
prev = cur
cur = cur.next