是否有线性方法可以找到单链表的中间元素? (线性 - 意味着你只能迭代列表一次AKA你总共完成的迭代次数不能超过列表的长度)
谢谢!
编辑:问题指出您事先无法知道列表的长度。
编辑2:问题是为Java编写的,但是使用了一些没有length()方法的链表定义
答案 0 :(得分:3)
这可能不适合您的约束,但它们非常模糊。它只需要列表的一次迭代(从一开始只开始一次,到达终点只有一次),但它需要存储两个独立的指针(因此跟随列表的一半&#) 39;下一个指针两次)。
答案 1 :(得分:2)
使用两个指向列表第一个元素的变量。然后遍历列表,在每次迭代时将第一个指针递增1位,将第二个指针递增2个位置。一旦第二个指针到达列表的末尾,第一个指针将包含中间元素(如果存在)。
一些伪代码......
list = [1, 2, 3, 4, 5]
ptr1 = list[0]
ptr2 = list[0]
while ptr2 is not null
ptr1 = ptr1.next
ptr2 = ptr2.next.next
return ptr1
答案 2 :(得分:1)
Node ptr1 = head;
Node ptr2 = head;
while(ptr1 != null || ptr1->next != null){
ptr1 = ptr1 -> next -> next;
ptr2 = ptr2 -> next;
}
修改强>
//this is wrong, so not needed so, upper part is enough.
if(ptr1->next != null){
ptr2 = ptr2 -> next;
}
答案 3 :(得分:0)
Node p1 = head;
Node mid = head;
while(p1 != null){
p1 = p1.next();
p1 = p1.next();
mid = mid.next();
}
请注意,顺序对p1和循环中的内容很重要。例如,如果列表中只有一个元素。这意味着头部将是中间的。但是,mid
将返回null
,因为它转到下一个元素,而不是在到达下一个元素之前退出循环。
错误执行
while(p1 != null){
mid = mid.next(); // incorrect order.
p1 = p1.next().next(); //will cause exception if p1.next == null
}