当检查链表的中间节点时,我对while循环条件在链表中的工作方式感到困惑
这是我找到链表中间节点的正确代码
class Node(object):
def __init__(self, data):
self.data = data
self.next = None
class linkedList(object):
def __init__(self):
self.head = None
def append(self, data):
node = Node(data)
if self.head == None:
self.head = node
temp = self.head
while temp.next:
temp = temp.next
temp.next = node
def middle(self):
first = self.head
second = self.head
while second and second.next:
second = second.next.next
first = first.next
print(first.data)
如果我将while循环更改为
while second:
或
while second.next:
我收到一条错误消息
AttributeError: 'NoneType' object has no attribute 'next' on line 24
我只是想知道为什么同时拥有second
和second.next
答案 0 :(得分:0)
该解决方案通过使用两个指针来工作。第一个每次一次执行1步,第二个每次一次执行2步。但是,采取2个步骤需要验证两点:
如果跳过一项检查,它将进入循环,但是在边界条件下找不到下一个。举例说明:如果有4个节点,而您仅在第3个节点上检查df['case_id'] = (~df['case'].eq(df['case'].shift(1).fillna(df.loc[0,'case'])) |
df['y'].shift(1).fillna(0)).cumsum()+1
print(df)
case y year caseid
0 A 0 2016 1
1 A 1 2017 1
2 A 0 2018 2
3 A 0 2019 2
4 B 0 2016 3
5 B 1 2017 3
6 B 0 2018 4
7 B 0 2019 4
8 C 0 2016 5
9 C 0 2017 5
10 C 1 2018 5
11 C 0 2019 6
,则将使second.next
有效,并进入second.next
循环,但在其中是直接访问while
F,S | 1-> 2-> 3-> 4->无
答案 1 :(得分:0)
对于初学者来说,您的append方法无效,并且陷入无限的while循环中,因为在添加第一个元素时您不会退出append。正确的版本是
def append(self, data):
node = Node(data)
if self.head == None:
self.head = node
return
else:
temp = self.head
while temp.next:
temp = temp.next
temp.next = node
关于您的另一个问题,我们希望找到偶数和奇数列表的循环中间位置,second.next
覆盖奇数列表的情况,而second
覆盖偶数列表的情况,因为第二个指针要么指向null,要么本身就是null,并且如果仅使用其中之一,则会得到您所描述的错误,因此您需要在while循环中同时包含两个条件