Reverse a singly linked list.
A linked list can be reversed either iteratively or recursively. Could you implement both?
方法一:遍历链表,新建链表从头开始加入
def reverse_linkedlist(head):
if head == None or head.next == None: #边界条件
return head
cur = head #循环变量
tmp = None #保存数据的临时变量
newhead = None #新的翻转单链表的表头
while cur:
tmp = cur.next
cur.next = newhead
newhead = cur # 更新 新链表的表头
cur = tmp
return newhead
方法二:详见
这里(方法三)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
p1 = head
p2 = head.next
tmp = None
while p2:
tmp = p2.next
p2.next = p1
p1 = p2
p2 = tmp
head.next = None
return p1
附官方解释:
The recursive version is slightly trickier and the key is to work backwards. Assume that the rest of the list had already been reversed, now how do I reverse the front part? Let's assume the list is: n1 → … → nk-1 → nk → nk+1 → … → nm → Ø
Assume from node nk+1 to nm had been reversed and you are at node nk.
n1 → … → nk-1 → nk → nk+1 ← … ← nm
We want nk+1’s next node to point to nk.
So,
nk.next.next = nk;
Be very careful that n1's next must point to Ø. If you forget about this, your linked list has a cycle in it. This bug could be caught if you test your code with a linked list of size 2.
关键在于这个n k.next.next = n kdef reverse_linkedlist(head):
if head is None or head.next is None:
return head
else:
newhead=reverse_linkedlist(head.next)
head.next.next=head
head.next=None
return newhead