链表结构
关于链表的结构请参考:
《剑指offer》预备知识-链表与二叉树
我会直接调用里面定义的这个链表的类(但不调用大部分的类方法,不然就是出猫了→_→)。
链表反向输出
offer05的要求是,给出和一个链表,要求反向输出。这里先给出一个[1,2,3,4,5]的链表
from linklist import ListNode, LinkList
l = LinkList()
for i in range(1,6,1):
l.append(i)
node = l.head
如果对数据结构有了解的话,就会第一时间考虑一个栈。请把栈想象成一个量筒,然后我们往里面装乒乓球(元素);当我们要取乒乓球的时候,就会有先进后出,后进先出的情况。这很符合题目的要求。因此用一个栈把链表里的元素记下来,然后输出即可。
# offer05-solution
def printListFromTailToHead(listNode):
if not listNode:
return []
res = []
while listNode.next is not None:
res.append(listNode.val)
listNode = listNode.next
res.append(listNode.val)
print(res[::-1]) # res相当于一个栈,先进后出,后进先出
return
printListFromTailToHead(node)
链表反转
offer21直接要求反转链表。
# offer21-solution
def ReverseList(pHead):
pre = None # 前一个
now = pHead # 现在
rear = None # 后一个
while now:
rear = now.next # 后指针向后移一位
now.next = pre # now指向前指针
if not rear: # now已经是原链表尾部,现链表头部
return now
pre = now # 前指针向后移一位
now = rear # 现指针向后移一位
ReverseList(node)
我使用的是一种三指针的形式。链表类的题目,一定要把图画出来,这种三指针的形式迭代的方法如下。
我也看到有利用双指针完成的思路,但是我自己没写出来,这里附上给大家参考。
小结
链表类的问题还有很多,这两个应该是比较典型的逆序问题。其中offer21会相对较难,自己搞的时候要上图理解。
参考:
【图文解析】反转一个单链表