[英]Iterating through Linked List
有线性方法来查找单链表的中间元素吗? (线性-意味着您只能在列表中迭代一次,也就是说,您所做的总迭代次数不能超过列表的长度)
谢谢!
编辑:问题指定您无法事先知道列表的长度。
编辑2:该问题是为Java编写的,但是使用了没有length()方法的某些链表定义
这可能不适合您的约束,但是它们很模糊。 它只需要列表的一次迭代(就意味着从头开始仅一次,而到达结束仅一次),但是这样做时需要存储两个独立的指针(因此紧随列表的下一个一半)指针两次)。
使用两个变量指向列表的第一个元素。 然后遍历列表,每次迭代将第一个指针增加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
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;
}
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.