【Leetcode刷题总结】(一)链表逆序

题目:

          给定一个带头的链表,将其逆序输出。

示例:

           输入:  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)                        

方法二:插入法

插入法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值