反转链表
1、题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
2、解题步骤:
(1) 方案一:
a、题解:
假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。
在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
b、代码:
"""
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
"""
class ListNode:
def __init__(self, value, next=None):
self.val = value
self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, prev = head, None
while cur:
next_code = cur.next
cur.next = prev
prev = cur
cur = next_code
# cur.next, prev, cur = prev, cur, cur.next
return prev
if __name__ == "__main__":
link = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
solution = Solution()
result = solution.reverseList(link)
result_list = []
while result:
result_list.append(str(result.val))
result = result.next
print("->".join(result_list))
c、运行结果:
(2) 方案二:
a、题解:
递归版本稍微复杂一些,其关键在于反向工作。假设列表的其余部分已经被反转,现在我该如何反转它前面的部分?
假设列表为:
若从节点 到
已经被反转,而我们正处于
。
我们希望 的下一个节点指向
。
所以,n_{k}nk.next.next = n_{k}nk。
要小心的是 的下一个必须指向 Ø 。如果你忽略了这一点,你的链表中可能会产生循环。如果使用大小为 2 的链表测试代码,则可能会捕获此错误。
b、代码:
"""
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
"""
class ListNode:
def __init__(self, value, next=None):
self.val = value
self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
next_node = self.reverseLists(head.next)
head.next.next = head
head.next = None
return next_node
if __name__ == "__main__":
link = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
solution = Solution()
result = solution.reverseList(link)
result_list = []
while result:
result_list.append(str(result.val))
result = result.next
print("->".join(result_list))
c、运行结果: