鑑於目前的節點,我怎麼能找到它以前在單鏈表節點。謝謝。邏輯會做,代碼表示讚賞。我們都知道給根節點人能做到連續進給,我想知道是否有避免順序訪問開銷更聰明的方式。 (假設沒有對根節點的訪問)謝謝。給出一個節點我怎麼能找到一個節點在一個單向鏈表
回答
你不能。
按定義,單鏈表僅將每個節點鏈接到其後繼者,而不是前驅者。沒有關於前任的信息;甚至沒有關於它是否存在的信息(你的節點可能是列表的頭部)。
你可以使用一個雙向鏈表。 你可以嘗試讓你擁有前身傳遞進來擺在首位的參數重新排列的一切。
您可以掃描整個堆尋找一個看起來像前驅節點的記錄,並指向您的節點。 (不是一個嚴肅的建議。)
你爲什麼說「你不能」?從搜索具有'next'等於'current'的節點的列表開始迭代有什麼問題。如果沒有找到匹配返回'NULL'或類似的東西? –
「你不能」的意思是「它不是數學上可能的」。有一些信息缺失,無法重新創建。這個問題(我認爲)很明顯,他們甚至無法訪問列表的頭部;所以沒有已知的起點可以按照你的建議進行迭代。 – hemflit
@hemflit,是的,沒有根節點。 –
從頭開始瀏覽列表,直到遇到一個節點,其節點鏈接指向您的當前節點爲next
。
但是,如果你需要這樣做,也許你不應該使用單向鏈表。
假設你正在談論一個前向單鏈表(每個節點只有一個指向'下一個'等),你將不得不迭代從列表的開始,直到你找到有'下一個'等於您當前的節點。顯然,這是一個緩慢的操作。
希望這會有所幫助。
你只對一個單向鏈表的選擇是一個線性搜索,類似下面(Python的仿僞碼):
find_previous_node(list, node):
current_node = list.first
while(current_node.next != null):
if(current_node.next == node):
return current_node
else:
current_node = current_node.next
return null
假設你使用着單向鏈表你的代碼看起來應該像
while(node)
{
previous = node
node = node.next
// Do what ever you want to do with the nodes
}
請問這個代碼停止在「當前」節點被發現? –
'如果(node.content == whatINeed){doSomething的(previous.content); }'。 – arunmur
使用nodeAt()方法並傳遞當前節點的頭部,大小和索引。
public static Node nodeAt(Node head,int index){
Node n=head;
for(int i=0;i<index;i++,n=n.next)
;
return n;
}
其中n返回前驅節點。
這是某種形式的黑客,我發現了,而現在,這裏解決問題(刪除列表中的每一個偶數節點)
internal void DeleteNode(int p)
{
DeleteNode(head, p);
}
private void DeleteNode(Node head, int p)
{
Node current = head;
Node prev = null;
while (current.next != null)
{
prev = current;
current = current.next;
if (current.data == p)
{
prev.next = current.next;
}
}
}
,在上一個分配電流,然後將電流下一個從而prev包含前一個節點。 希望這有助於...
這裏有一個小竅門與線性搜索:只是通過在節點或者其前面的節點,則它的位置正在尋找:
private MyNode findNode(int pos) {
//node will have pos=pos-1
pos-- = 1;
MyNode prevNode = null;
int count = 0;
MyNode p = first.next; // first = head node, find it however you want.
//this is for circular linked list, you can use first!=last for singly linked list
while (p != first) {
if (count == pos) {
prevNode = p;
break;
}
p = p.next;
count++;
}
return prevNode;
}
Node* temp = head;
Node* prev = head;
while(temp !=null && temp->data==key){
prev = temp;
temp = temp->next
}
感謝您使用此代碼段,這可能會提供一些有限的短期幫助。通過展示*爲什麼*這是一個很好的解決方案,並且使它對未來的讀者更有用,一個正確的解釋[將大大提高](// meta.stackexchange.com/q/114762)其長期價值其他類似的問題。請[編輯]你的答案以添加一些解釋,包括你所做的假設。 –
- 1. 我怎麼能找到,如果一個子節點存在
- 2. 找到一個XML節點
- 3. 查找從一個節點到另一個節點的層數
- 4. 在給定節點之後在雙向鏈表中插入一個節點
- 5. 在雙向鏈表中給定節點之前插入一個節點
- 6. (算法)找到具有從一個節點到另一個節點的單一路徑的節點
- 7. 添加一個節點到鏈表
- 8. 添加一個節點到鏈表頭
- 9. 如何將節點從一個鏈表添加到另一個節點
- 10. 爲什麼這會一直返回我單向鏈表中的一個節點?
- 11. C++獲得單節點鏈表中匹配節點的前一個節點
- 12. 在java中單向鏈表中刪除一個節點
- 13. 在Python中的單向鏈表中的另一個節點之前插入一個節點?
- 14. 錯誤,當我從一個鏈表中刪除一個節點
- 15. 找到一個節點,它在一個查詢中匹配後代節點
- 16. 添加一個節點到一個循環鏈表
- 17. 相關一個節點到另一個節點
- 18. Re將pod從一個節點調度到另一個節點
- 19. 將一個節點拖放到另一個節點中
- 20. 如何找到鏈表的第一個節點不知道頭節點
- 21. 我怎麼能知道,如果一個節點exsits或不
- 22. 複製鏈接列表,每個節點都有一個變量,它隨機指向另一個節點列表
- 23. 我怎樣才能一次解析一個節點?
- 24. 改變一個鏈表的節點
- 25. 刪除從一個單向鏈表節點(除尾)
- 26. 從單向鏈表中刪除最後一個節點(java)
- 27. 如何給一個節點Vis.js到
- 28. 最後一個節點值鏈表更新所有節點
- 29. 下一個節點
- 30. tikz:一個節點
代碼將在這裏感謝也回答這個問題。 – ldav1s