一开始直接在力扣上过的,没啥问题
#双指针
# 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