题目:
给定一个带头的链表,将其逆序输出。
示例:
输入: head->1->2->3->4->None
输出: head->4->3->2->1->None
方法一:就地逆序
【注意】:1 链表的使用,只需要给出head节点就可以串起整个链表。
2 链表的第一个节点为头节点。头节点的数据域为空。链表的首节点指的是除了头结点之外的第一个节点。
3 链表的尾节点是最后一个节点,链表的尾节点的指针域为空。(即nail.next = None)
分析:
三个指针,pre,cur,next 分别代表前置,当前,后置指针,然后不断向后滑动,让当前节点的本来指向后置节点的指针 指向前置节点。这样做有几个点需要注意:
首先,在动当前节点的指针前,一定要先把当前节点的指针记下来,用next= cur.next 进行保存,否则动完了当前节点cur 的指针,就找不到后置节点next了。
其次,链表的首节点需要特殊处理,因为它没有pre节点,所以循环跑不起来,需要手动把它接挂,然后把它指针域清空,作为尾节点
最后,当cur为最后一个节点时,也需要特殊处理,因为它没有后置节点,所以,需要手动让他指向前一个节点pre。
最后的最后,把链表的头结点head.指向最后一个节点就完成了。
关键代码:
def Reverse(head):
if head ==None or head.next == None: #判断是否为空链表(压根没有头,或者有头没数据都叫空)
return 0
pre = None #把要用的指针定义好
cur = None
next = None
cur = head.next #先处理首节点
next = cur.next #把cur的后置节点存下来
cur.next = None #首节点变尾节点
pre = cur #向后移动
cur = next
while(cur.next != None):
next = cur.next #把cur的后置节点存下来
cur.next = pre #让cur指向pre
pre = cur #向后移动
cur = next
cur.next = pre #处理尾节点的指针(让尾节点指向他的pre)
head.next = cur #让头节点指向尾节点
性能分析:
时间复杂度O(n) 遍历一次链表
空间复杂度O(1)
方法二:插入法
插入法