剑指Offer(三):从尾到头打印链表
PS:个人笔记。根据Jack-Cui的博客学习,C++学会了再补。
题目描述:
输入一个链表,返回一个反序的链表。
思路:
通常,这种情况下,我们不希望修改原链表的结构。返回一个反序的链表,这就是经典的“后进先出”,我们可以使用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中(先把节点放在栈底)。当遍历完整个链表后,再从栈顶开始逐个输出结点的值(栈顶拿的值是最后放的,这样就达到了后进先出的效果),给一个新的链表结构,这样链表就实现了反转。
链表是数据结构中最基本常用的,C++语言中单链表是利用指针操作实现的,python作为面向对象编程的,可以使用创建一个Node类来实现链表,利用类的属性引用来代替指针操作。
代码:
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: #⭐这个代码尝试后报错 def printListFromTailToHead(self, listNode): # write code here result = [] while listNode: result.insert(0, listNode.val) listNode = listNode.next return result
另一个博主的代码:
class ListNode(): #链表的构造,初始化 def __init__(self, x): self.val = x self.next = None def CreateList(n): #链表的创建 if n <= 0: #没有节点报错 return False if n == 1: #只有一个节点 return ListNode(1) else: listNode = ListNode(1) tmp = listNode for i in range(2,n+1): #一个一个增加节点 tmp.next = ListNode(i) tmp = tmp.next return listNode #返回根节点 def PrintList(listNode): #用以打印链表结点 tmp = listNode #不要改变原来的链表 while tmp: print(tmp.val) tmp = tmp.next def function1(listNode): lists = [] while listNode: lists.append(listNode.val) listNode = listNode.next return lists[::-1] #这里步长设置-1,就反过来了 def function2(listNode): lists = [] while listNode: lists.append(listNode.val) listNode = listNode.next lists.reverse() #直接用一个表格的方法 return lists def main(): listNode = CreateList(11) #打印链表进行测试 PrintList(listNode) print(function1(listNode)) if __name__ == "__main__": main()