双向链表和顺序链表99%都是相同的。主要的区别是:每个节点包含两个指针,next
指针指向后一个元素(若存在)即aj指向aj+1,另一个prev
指针指向前一个元素,即aj指向aj-1(若存在)。
prev
指针是的双向链表能够反向遍历,但同时也增加了内存的消耗。它解决了顺序链表中移除尾元素的低效问题。
注意:在本教学中,双向链表(以及之后的双端队列)的边界是无方向的。
Remove(i) - At Tail(i = N-1) 复习
顺序链表最大的问题是尾元素的移除,即时我们有指向尾元素的指针,因为我们需要将tail
指针指向尾元素的前一个。
有了双向链表的反向能力,我可以直接找到前一个元素:
1 |
|
example DLL [22 (head)<->2<->77<->6<->43<->76<->89 (tail)]
练习
insertHead(50)
-insertTail(10)
insert(3,4)
removeHead()
remove(5)