given a singly linked list l: l0→l1→…→ln-1→ln,
reorder it to: l0→ln→l1→ln-1→l2→ln-2→…
you must do this in-place without altering the nodes』 values.
for example,
given , reorder it to .
分析:這道題的思路首先用快慢指標找到鍊錶的中點,然後將此鍊錶分成兩部分,再將後面的鍊錶逆序,最後將兩部分合併即可。
第一種解法
class solution
tail->next = nullptr; //分成一半 前半部分在奇數時比後半部分小1
reverselist(lowp);
fastp = head;
tail = nullptr;
while(fastp != nullptr)
if(lowp != nullptr)
tail->next = lowp; //把最後乙個元素,即中間那個元素新增到鍊錶的最後
}void reverselist(listnode* &head)
head->next = nullptr;
head = pre;
}};
第二種解法
class solution
}listnode* findmid(listnode* head)
return slow
}listnode* reverselist(listnode *head)
head->next = nullptr;
return pre;
}};
第三種解法
public
class
solution
listnode mid = slow.next;
listnode last = mid;
listnode pre = null;
while(last != null)
slow.next = null;
while(head != null && pre != null)
}}
鍊錶 reorder list
我之前是想著,用棧來儲存倒置的鍊錶,然後再以結點數作為while條件來依次地插入。可是超時了。因為別人題解裡也有這種做法,但是有通過,看了一下,可能原因出在 別人找了鍊錶的中點,只是用棧儲存了鍊錶的後半部分 而我是棧儲存全部部分。看了題解受到啟發,用了另一種方法 化解為熟悉的三個小題 感覺這種思想不...
Reorder List 穿插反轉鍊錶
given a singly linked list l l0 l 1 ln 1 l n,reorder it to l 0 ln l1 l n 1 l 2 ln 2 you may not modify the values in the list s nodes,only nodes itsel...
pta重排鍊錶
本文提供pta重排鍊錶的兩種方法,兩種都是使用陣列模擬鍊錶的操作,區別在與所使用空間的大小不同,從而導致時間複雜度也不同。重排鍊錶的第一種方法 這種方法節省了很多空間,但在n非常大時會超時。include include includetypedef struct node list struct ...