![](/img/trans.png)
[英]Given a single linked list with an odd number of nodes, what are 2 ways of finding middle node by traversing list only once?
[英]Finding middle of single linked list
我修改了函數以照顧偶數個節點的情況,但是由於這個原因,我的代碼不適用於奇數個節點。 怎么了?
public LinkedList findMiddleNode() {
Node t1 = this.getHeadNode();
Node t2 = this.getHeadNode();
LinkedList l = new LinkedList();
boolean even = false;
while(t1.getNext() != null) {
t1 = t1.getNext();
if(t1.getNext()!= null && t1.getNext().getNext() != null) {
t1 = t1.getNext();
t2 = t2.getNext();
}
}
if(t1.getNext()!=null)
l.insertFirst(t2.getElement());
else {
l.insertFirst(t2.getElement());
l.insertLast(t2.getNext().getElement());
}
return l;
}
@oldrinb:thnx為您提供幫助,這是我的更新代碼:
public LinkedList findMiddleNode() {
Node t1 = this.getHeadNode();
Node t2 = this.getHeadNode();
LinkedList l = new LinkedList();
boolean even = false;
while(t1.getNext() != null && t1.getNext().getNext() != null) {
t1 = t1.getNext().getNext();
t2 = t2.getNext();
}
if(t1.getNext()==null)
l.insertFirst(t2.getElement());
else {
l.insertFirst(t2.getElement());
l.insertLast(t2.getNext().getElement());
}
return l;
}
/* determine length of list */
int n = 0;
for (Node cur = getHeadNode(); cur != null; cur = cur.getNext()) {
++n;
}
/* go half-way */
int m = n / 2;
Node mid = getHeadNode();
while (m > 0) {
mid = mid.getNext();
--m;
}
/* if n is odd, both mid and mid.getNext() are the middle */
if ((n % 2) != 0) {
Node mid2 = mid.getNext();
...
} else {
...
}
...或者,
Node tortoise = getHeadNode();
Node hare = getHeadNode();
do {
tortoise = tortoise.getNext();
} while (hare.getNext() != null && (hare = hare.getNext().getNext()) != null);
/* tortoise is the middle */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.