1. 程式人生 > >JAVA基礎——鏈表結構之雙端鏈表

JAVA基礎——鏈表結構之雙端鏈表

插入 exp 圖片 last bsp ext 一點 code static

雙端鏈表:雙端鏈表與傳統鏈表非常相似.只是新增了一個屬性-即對最後一個鏈結點的引用技術分享圖片 如上圖所示:由於有著對最後一個鏈結點的直接引用.所以雙端鏈表比傳統鏈表在某些方面要方便.比如在尾部插入一個鏈結點.雙端鏈表可以進行直接操作 但傳統鏈表只能通過next節點循環找到最後鏈結點操作.所以雙端鏈表適合制造隊列. 下面的雙端鏈表類.有幾個重要方法. insertFirst(插入首鏈結點) 這個方法與上篇博文的單鏈表是基本一樣的.唯一區別就是,多了個last引用的操作.正常由於last是指向尾鏈結點的引用,所以插入首鏈結點是與他無關的. 但當鏈結點為空(isEmpty())的時候,這會追加的鏈結點既是首鏈結點又是尾鏈結.所以需要將last指向它.

技術分享圖片 public void insertFirst(double dd) { Link newLink = new Link(dd); if(isEmpty()){ last = newLink; } newLink.next = first; first = newLink; } 技術分享圖片

insertLast(插入尾鏈結點) 插入尾部鏈結點也是與普通的理解基本一致,所以不多贅述.唯一也要註意的是鏈結點為空(isEmpty())的時候.需要將first指向該鏈結點.

技術分享圖片 public void insertLast(double dd) { Link newLink = new Link(dd); if(isEmpty()) { first = newLink; }else { last.next = newLink; } last = newLink; }
技術分享圖片

看下插入尾部鏈結點的引用指向: 技術分享圖片 deleteFirst(刪除首部鏈結點) 這個需要註意的就是,如果僅剩下一個鏈結點.那麽刪除後last就應該指向null了.

技術分享圖片 public void deleteFirst() { first = first.next; if(first.next == null) { last = null; } } 技術分享圖片

最後這個代碼如下:

技術分享圖片FirstLastLink

代碼運行結果為:

List (first--->last)66.0 44.0 22.0 11.0 33.0 55.0 List (first--->last)22.0 11.0 33.0 55.0

鏈表的效率 這裏順便談下鏈表和數組相比效率的優越性.在表頭插入和刪除的速度都很快,因為只需要改變一下引用所以花費O(1)的時間. 平均起來查找,刪除和在指定節點後插入數據都需要搜索一半的鏈結點.需要O(N)次比較和數組一樣.然由於鏈表刪除插入的時候 不需要像數組那種元素的移動.所以效率還是要優於數組. 還有一點就是鏈表的內存可以隨時的擴展內存.而數組的內存是一開始就固定好的.這樣就會導致數組的效率和可用性大大下降.

JAVA基礎——鏈表結構之雙端鏈表