leetcode(206):Reverse Linked List

本文介绍了一种使用Python实现的单链表反转算法,包括迭代和递归两种方法,并通过详细的代码示例展示了如何实现这一过程。同时,还讨论了在实现过程中遇到的一些常见问题及其解决方案。

题目的要求是:反转一个单链表
题目的线索:可以采用递归或者迭代来实现。
这题分析起来,有一个很顺畅的思路,就是遍历一遍结点,将其存到栈里面,然后依次出栈呀,出一个记录,下一个出栈的结点是上一个出栈结点的后继,这样就可以实现反转,现在关键问题在于:如何来实现栈,使用的python,所以采用list结构来存储结点,实现类似于栈操作的技能。
代码实现(python)
(迭代实现)

# 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 head == None:
            return head
        node = head.next
        if node == None:
            return head
        head.next = None
        node_list = []
        while node != None:
            node_list.append(node)
            node = node.next
        for i in range(len(node_list))[::-1]:
            if i == 0:
                node_list[i].next = head
                break
            else:
                node_list[i].next = node_list[i-1]
        return node_list[len(node_list)-1]

出现的问题的总结和反思:
边界情况没有考虑到:一是,如果输入不规范怎么办;第二是,如果仅仅有一个结点的话,其实涉及的是列表没有元素,可能会溢出。
以后的经验:对边界结点做好判断,需要想一些特殊的案例来进行测试。
在这一题中的迭代的方法中,只要信息保存的足够,不要丢失链表信息,可以不借助外力,也可以实现。看了大佬们的思想,我惭愧呀

class Solution:
# @param {ListNode} head
# @return {ListNode}
def reverseList(self, head):
    prev = None
    while head:
        curr = head
        head = head.next
        curr.next = prev
        prev = curr
    return prev

其实在这题开始思考的时候,采用递归的思想,会比采用迭代的思想来的更自然一些,所以,尝试着用递归的方法来重新实现一遍。
递归,真的不知道怎么来记录呀·~尴尬!!
把大佬们实现的代码重新码一遍,真的不知道该怎么处理,总是遗漏信息,大佬们的思想主要是将前驱后继都记录下来,然后递归的来调用。

class Solution:
# @param {ListNode} head
# @return {ListNode}
def reverseList(self, head):
    return self._reverse(head)

def _reverse(self, node, prev=None):
    if not node:
        return prev
    n = node.next
    node.next = prev
    return self._reverse(n, node)

在大佬的实现中,主要是对结点,结点的前驱,以及结点的后继都予以记录,然后通过不同的赋值等操作,最终实现反转。
今天跟傻狗讨论这个, 我觉得傻狗的那个思路很简洁,就是需要一个fake head。特将简洁的思路记录下来。
.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值