如何返回链表的中间节点

时间:2019-04-16 04:15:35

标签: python python-3.x linked-list

当检查链表的中间节点时,我对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

我只是想知道为什么同时拥有secondsecond.next

为什么很重要

2 个答案:

答案 0 :(得分:0)

该解决方案通过使用两个指针来工作。第一个每次一次执行1步,第二个每次一次执行2步。但是,采取2个步骤需要验证两点:

  1. 下一步是有效的
  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循环中同时包含两个条件