我們說一個頭鏈表是由一個稱爲頭節點的特殊節點組成的,它標記了列表的開始,但我不明白這個頭節點的真正重要性。 請幫我嗎?需要頭節點
Q
需要頭節點
0
A
回答
2
哨兵節點阻止你處理某些邊緣情況。
最大的是空檢查:你總是知道在列表頂部會有一個節點可以插入節點,所以你不必處理檢查head是否爲空。 (也可以幫助有類似的原因,尾節點)
考慮兩種情況:
有了頭和尾節點:
addNewDataAtHead(data):
newNode = new Node(data);
newNode.next = head.next;
newNode.prev = head;
head.next.prev = newNode;
head.next = newNode;
沒有:
addNewDataAtHead(data):
newNode = new Node(data);
if (head == null):
head = newNode;
newNode.next = head;
head.prev = newNode;
head = newNode;
的第一個的意圖更清晰,因爲它就像插入其他地方一樣。第二種情況要求您檢查特殊情況。
1
存在某種鏈接列表,您可以極大地簡化附加,插入和刪除代碼,代價是隻需少量存儲,並且在遍歷列表時只需極少的額外工作即可。
那是因爲一個空列表如下:
+-------+ +-------+
head -> | dummy | -> | dummy | -> null
null <- | head | <- | tail | <- tail
+-------+ +-------+
而是擔心是否要追加(或插入)的空單,還是你的缺失將創建一個空列表,它的簡單得多。
初始化變得稍微複雜一些,原來在左邊,按照全部右邊修改下面的代碼。這通常不會導致問題,因爲列表創建發生了一次但插入和刪除發生了很多。
def init(): def init():
head = null head = new node
tail = null tail = new node
head->next = tail
head->prev = null
tail->prev = head
tail->next = null
比較經典的追加(插入變得更爲複雜,因爲你可能需要head
之前插入,在中間,或tail
後)與簡化的一個:
def append (node): def append (node):
node->next = null node->next = tail
if head == null: node->prev = tail->prev
head = node tail->prev = node
tail = node
node->prev = null
else:
tail->next = node
node->prev = tail
tail = node
缺失也是大大簡化了,因爲使用經典鏈接列表,有很多檢查以確保您不會取消引用空指針:
def delete (node): def delete (node):
if node == head and node == tail: if node != head and node != tail:
head = null node->prev->next = node->next
tail = null node->next->prev = node->prev
elsif node == head: free node
head = head->next
head->prev = null
elsif node == tail:
tail = tail->prev
tail->next = null
else:
node->prev->next = node->next
node->next->prev = node->prev
free node
The co德遍歷列表需要排除當然,虛擬節點,但這是一個微不足道的變化:
def traverse (head): def traverse (head):
node = head node = head->next
while node != null: while node != tail:
do something with node do something with node
node = node->next node = node->next
我自己,我不是這樣的代碼的大風扇,因爲它可能表明人們都懶得了解數據結構和算法是如何工作的。我寧願擁有更復雜的代碼,因爲它表明人們可以思考問題。無論如何,這只是你一次只寫的東西。
相關問題
- 1. 需要TreeViewItem的頭節點高度
- 2. 不需要節點
- 3. 不需要的節點ShouldJS
- 4. 在節點需要語法
- 5. 需要提取XML節點的文本和子節點(PHP)
- 6. 從多少個節點你需要專用主節點
- 7. R中決策樹中的節點 - 需要更多節點
- 8. 需要XLST根據另一個節點更改節點的值
- 9. jstree預選節點並打開所有需要的父節點
- 10. 命名空間節點 - 需要
- 11. 需要生成N個節點。堅持
- 12. 條件節點/ Browserify需要庫嗎?
- 13. 爲什麼removeChild需要父節點?
- 14. 刪除不需要的XML節點
- 15. 節點需要有兩個括號
- 16. 節點需要json持續跨文件
- 17. 使用PHP需要一個Drupal節點
- 18. 的Neo4j - 需要在同一節點對
- 19. XML重複節點幫助需要
- 20. Drupal:不需要的重複節點
- 21. 需要節點中的其他文件
- 22. 咕嚕咖啡節點需要()支持
- 23. 需要節點模塊本地
- 24. 需要圖形D3接節點
- 25. 節點不需要* .coffee文件
- 26. 節點模塊是否需要對方
- 27. 主節點需要經過系統
- 28. 需要節點模塊的新實例
- 29. 需要找到其父節點ID
- 30. 需要()節點模塊通過HTTP服
你的問題太模糊,無法回答。 – wnoise 2010-11-17 06:58:23