题目的要求是:反转一个单链表
题目的线索:可以采用递归或者迭代来实现。
这题分析起来,有一个很顺畅的思路,就是遍历一遍结点,将其存到栈里面,然后依次出栈呀,出一个记录,下一个出栈的结点是上一个出栈结点的后继,这样就可以实现反转,现在关键问题在于:如何来实现栈,使用的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。特将简洁的思路记录下来。
.