如何找到鏈表的中間,當我們沒有被告知它的大小,它必須只使用一個循環,只有一個指針來進行的。中間鏈表
中間鏈表
回答
約
LinkedList * llist = getLList(); // the linked list
Node * node = llist.head;
while (node) {
node = node.next;
if (node) {
node = node.next;
llist.remove(llist.head);
}
}
// now llist.head is (er, um... was) the middle node.
// hope you didn't need the rest of the list.
Node *m,*e,*head; /* head is given */
m=e=head;
while(e) {
e=e->next;
if (e) {
e=e->next;
m=m->next;
}
}
/* now m is the middle node */
對不起,我不得不用兩個指針:)
添加給你的答案,因爲一個小調整降低指針的數量爲1。我希望你不介意:
Node m,*e,*head; /* head is given */
e = head;
if (e) m = *e;
while(e) {
e = e->next;
if (e) {
e = e->next;
m = *(m.next);
}
}
/* now m is the middle node */
嗯,這是一種破解,因爲它在功能上等同於2個循環。但是,它仍然只有1個循環。
Node* middle(Node* const begin)
{
Node* current = begin;
bool size_known = false;
int size = 0;
while (true)
{
if (!size_known)
{
if (current)
{
++size;
current = current->next;
}
else
{
current = begin;
size_known = true;
}
}
else
{
if (size <= 1)
return current;
current = current->next;
size -= 2;
}
}
}
如何使用額外的布爾和一個額外的int不同於使用一個額外的指針? – Thilo 2009-11-17 04:48:01
怎麼看我的代碼。它適用於我的FC9 x86_64的正確,功能「中間()」是你想要什麼:
static struct node *middle(struct node *head)
{
struct node *mid = head;
int flag = 0;
while (NULL != head) {
head = head->next;
flag = !flag;
if (flag) {
mid = mid->next;
}
}
return mid;
}
編輯:刪除代碼,除了中間的()。
使用提供的頭指針對列表進行迭代,然後增加一個允許的指針(我假設您的模糊問題是允許一個指針除了傳入的指針)每兩個增量的頭指針。
Node* middle(Node* head)
{
Node* middle = head;
while (head != NULL) {
head = head->next;
if (head->next != NULL) {
head = head->next;
middle = middle->next;
}
}
return middle;
}
這裏有一些邊緣情況被忽略(比如什麼是偶數個元素的列表中間)。
我們可以在這種情況下使用跳躍列表:
1)在鏈表遍歷每個節點使奇數節點的跳躍列表。時間:O(n)的空間:O(N/2)
2)現在,當你到達列表的末尾除以2 legnth加1得到中間元素的索引。
3)搜索在跳躍列表O(LOGN)時間的索引。
因此,該算法的總的時間複雜是:
爲O(n)(1個遍歷)+ O(LOGN)(搜索跳轉列表)= O(n)的 空間複雜度:O(N/2)
請回復,如果這是低效....
我在IBM ISL浦那類似的問題。問:「如何查找單鏈表的中間節點」。 我回答 答:「拿兩根指針開始在頭部和移動在一步一個指針,並在兩個步驟的另一指針」。採訪者說,這是最簡單的解決方案。問:告訴我你將如何遍歷而不使用2個指針。提示是「使用編譯器屬性」。
有誰知道如何使用編譯器屬性查找中間節點?
- 1. 單鏈表 - 刪除中間
- 2. 單鏈表中的時間複雜度
- 3. 單鏈表中間添加節點
- 4. 單鏈表的中間節點
- 5. 區間鏈接列表
- 6. 雙端鏈表和雙鏈表之間的區別
- 7. Python鏈接列表 - 鏈接列表之間的排序
- 8. C++鏈表中存儲一個鏈表
- 9. 在鏈表中插入一個鏈表
- 10. 從鏈接列表中獲取鏈接到鏈接列表中
- 11. 鏈表(2D鏈表?)
- 12. 鏈接兩個表之間的列
- 13. 在表格之間存儲鏈接
- 14. python鏈表超時時間超過
- 15. 差異在C和Java之間鏈表
- 16. Pentaho CDE儀表板之間的鏈接
- 17. 表間的鏈接性能和數量
- 18. 單鏈表和時間複雜性
- 19. 數據庫之間的鏈接表
- 20. Oracle鏈步驟的不同時間表
- 21. 表名空間的鏈接服務器
- 22. 通過將最後一個節點指向中間節點將單鏈錶鏈接轉換爲循環鏈表
- 23. jQuery鏈接中間步驟
- 24. 「消息鏈」vs「中間人」
- 25. 在恆定時間複雜度中查找雙鏈表的中間元素
- 26. python中的鏈表
- 27. 單鏈表和雙鏈表之間是否存在性能差異?
- 28. JVM空間複雜度的細節:單鏈表VS雙向鏈表
- 29. 刪除位於鏈接列表中間的節點
- 30. 使用遞歸查找鏈表的中間節點
這是整個問題嗎?你允許使用遞歸嗎? – rlbond 2009-11-17 04:36:04
這是一個單鏈接還是雙鏈表? – paxdiablo 2009-11-17 04:36:16
如何使用只有一個互聯網連接和只有一個stackoverflow網站找到我的作業問題的答案... – 2009-11-17 04:37:58