16-代码随想录206反转链表

16-代码随想录206反转链表

206.反转链表
力扣题目链接(opens new window)

题意:反转一个单链表。

示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
在这里插入图片描述
输入:head = [1,2]
输出:[2,1]
示例 3:

输入:head = []
输出:[]
提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

双指针+递归一起来

class ListNode:#定义一个节点
    def __init__(self,val=0,next=None):
        self.val=val
        self.next=next
class MyLinkList:
    def __init__(self):
        self.head=ListNode
        self.size=0
    def initList(self,data):
        self.head=ListNode(data[0])
        r=self.head
        p=self.head
        for i in data[1:]:
            node=ListNode(i)
            p.next=node
            p=p.next
            self.size+=1
        return r
    def reverseList(self):#双指针法
        cur=self.head
        pre=None
        while(cur):
            temp=cur.next
            cur.next=pre
            pre=cur
            cur=temp
        return pre
    def reverseList1(self,cur1,pre1):#递归法
        if cur1==None:
            return pre1
        temp1=cur1.next
        cur1.next=pre1
        return self.reverseList1(temp1,cur1)

    def printlist(self,head):#打印链表
        if head==None:return
        node=head
        while node!=None:
            print(node.val,end='')#在不换行的情况下打印节点(或元素)的值
            node=node.next

if __name__=='__main__':
    l=MyLinkList()
    data=input("输入链表:").split()
    if data==[]:
        print("[]")
    else:
        l1 = l.initList(data)
        l.printlist(l1)
        print('\n')
        print("反转成功后:", end='\n')
        pre = l.reverseList()
        l.printlist(pre)
        print('\n')
        print("再反转成功后:", end='\n')
        pre1 = l.reverseList1(pre, None)
        l.printlist(pre1)



运行

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小结

一定要注意递归的时候,每次再输入的值都在变,要在递归函数之外定义好初始值。然后可能要注意的就是打印链表是需要写链表函数的,它返回只有头指针,打印是要遍历再打印。还要注意的是打印函数里面输出设置为不换行,换行的话在主函数里自己写print就行。

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淅淅同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值