我不完全理解leetcode上“查找链表中间位置”问题的while
循环条件:
给定一个非空的、带头节点头的单链表,返回链表的中间节点。
如果有两个中间节点,则返回第二个中间节点。
对于while
循环,我认为条件是
while first and last.next:
但当我这么做的时候,我会收到一个错误
AttributeError: 'NoneType' object has no attribute 'next'
条件声明应该是
while last and last.next:
我不明白为什么。下面是带有正确而循环的整个代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def middleNode(self, head):
first = last = head
while last and last.next:
first = first.next
last = last.next.next
return first
只要把它画出来就会很明显。考虑两个版本:
A-B-C
first / last / last.next
A B C
B None
A-B-C-D
first / last / last.next
A B C
B D None
算法背后的想法是,你不知道列表的末尾在哪里。但是,如果一个指针的移动速度是另一个指针的两倍,那么它将到达终点,就像另一个指针到达中间一样。
初始化将中间(第一个
)和结束(最后一个
)指针设置为最初唯一知道的内容:列表的开始。循环体将它们向前推进:first=first。下一步
向前移动一步,而last=last。下一个下一步
向前移动两步。由于last
始终位于first
之前,因此无需检查first
是否可以向前移动。相反,循环的条件检查步进last
中使用的两个引用在last和last时是否为非None
:。下一步:
。
请注意,如果列表有一个元素,last
将不会在last之后移动。下一个
是无
。但是,对于两个元素,last
将移动,而first
也将移动。结果是满足了从元素数为偶数的列表中选择第二个中间位置的条件。
我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码:
我在以递归方式从循环单链表中删除单个节点/值时遇到了一些问题(当然,如果可能的话)。我的代码只从中间删除,而不是从第一个或最后一个地方删除。 在以递归方式删除其中一个连接后,我不知道如何建立连接。我的意思是,如果我要删除第一个元素,那么我需要将最后一个节点连接到下一个节点。 这是我的代码: 参数和返回: 查找尾部功能:
我需要实现一个循环的单链表数据结构。我无法理解的是何时何地必须声明列表的最后一个节点必须指向第一个节点。我有以下空构造函数来构建列表: 因此,基本上每个列表都以一个null对象开始,该对象再次指向null,表示列表结束: 然而,我不知道的是如何使它当列表包含至少一个节点时,该节点将指向列表的第一个节点。 例如,看看我为常规链表实现的addLast()方法: 我必须把它变成这样: 一旦列表的下一个节
最近,我已经完成了检测循环中第一个节点的算法,如下所述:- 注:本声明摘自以下网站:- http://javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html 步骤1:找到循环后,两个指针都指向在循环内的交汇点的公共节点, 步骤2:现在,在它们之间移动一个指针(比如乌龟)到列表的头部,保持野兔指针在循环内的交汇点的相同位置。 步
在我的DSA课程期中考试中,我有一个问题: 考虑单个链表包含n个节点(n) 选择一个: a、 O(N)和O(N) B.O(1)和O(1) C.O(1)和O(N) d、 O(N)和O(1) 给出的正确答案是c。O(1)和O(N)。不过我认为正确答案是a。我知道如果N=8,从一开始就需要O(1)时间来找到第8个节点(只需返回尾部节点),但在这种情况下N 提前感谢您能提供的任何帮助。
当检查链表中的中间节点时,我对同时循环条件在链表中的工作方式感到困惑 这是正确的代码我有找到中间节点的链表 如果我将while循环更改为 或 我收到一个错误,上面写着 我只是想知道为什么拥有第二个代码和second.next代码很重要