LeetCode算法笔记-Python(PyCharm)-206.反转链表

一开始直接在力扣上过的,没啥问题

#双指针
# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur = head   
        pre = None
        while(cur!=None):
            temp = cur.next # 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur.next = pre #反转
            #更新pre、cur指针
            pre = cur
            cur = temp
        return pre

但是在pycharm上报错 'list' object has no attribute 'next'

这是因为在IDE上传参的形式还是 list,力扣是通过接口将我们传入的list转化成了 ListNode 了。

我们应该重写ListNode这个类

class ListNode:
    def __init__(self,val,next=None):
        if isinstance(val,int):# 判断val的类型是否为整数
            self.val = val
            self.next = None
        elif isinstance(val,list):# 判断val的类型是否为列表
            self.val = val[0]#先把第0个值赋给第0个节点
            self.next = None
            head = self# 将self传给head,即头指针,现在头指针已经是指向第0个节点
            for i in range(1,len(val)):# 便利列表
                node = ListNode(val[i])# 将ListNode实例化,并存储列表的第i个值,作为节点node
                head.next = node# 临时头指针的next指向第i个节点
                head = head.next# 相当于临时头指针指向第i个节点
                #下一个循环中就可以继续连接下一个列表元素,并再次更新头指针


class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        #用来记录上一个节点,最开始指向None
        prev = None
        #保存当前的链表,最开始指向的是头节点
        curr = head
        while curr != None:# 当curr指向空时,结束循环,curr最开始是指向头指针的
            #保存后一个节点,
            temp = curr.next
            #改变节点的指向,反转链表
            curr.next = prev
            prev = curr
            #继续处理后面的链表
            curr = temp
        return prev

l = [1,2,3,4,5]
list_node = ListNode(l)
obj = Solution()
reve_list_node = obj.reverseList(list_node)
while reve_list_node:
    print(reve_list_node.val)
    reve_list_node = reve_list_node.next

输出的结果:

D:\Anaconda3\python.exe C:/Users/12549/Desktop/likou/206.py
5
4
3
2
1

Process finished with exit code 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值