[LeetCode]Reverse Linked List@python

Reverse a singly linked list.

click to show more hints.

Hint:

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-1nk → 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 k

def 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  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值