1. 程式人生 > >資料結構之雙向連結串列(JAVA實現)

資料結構之雙向連結串列(JAVA實現)

歡迎轉載,請附出處:
http://blog.csdn.net/as02446418/article/details/47114711
最近重新複習了一些基礎的資料結構,發覺自己好多已經淡忘了,索性重新撿起來以前的知識,今天筆者回顧了一下連結串列的知識,用JAVA實現了一個雙向連結串列,下面來看程式碼:

public class DoubleLinkedList  
{  
  // 節點類Node  

  private static class Node  
  {  
    Object value;  
    Node prev = this;  
    Node next = this
; Node(Object v) { value = v; } public String toString() { return value.toString(); } } private Node head = new Node(null); // 頭節點 private int size; // 連結串列大小 // 以下是介面方法 //新增到連結串列表頭 public boolean addFirst(Object o) { addAfter(new
Node(o), head); return true; } //將元素新增到連結串列表尾 public boolean addLast(Object o) { addBefore(new Node(o), head); return true; } public boolean add(Object o) { return addLast(o); } //將元素新增到指定位置 public boolean add(int index, Object o) { addBefore(new
Node(o), getNode(index)); return true; } //移除指定位置 public boolean remove(int index) { removeNode(getNode(index)); return true; } //移除連結串列表頭元素 public boolean removeFirst() { removeNode(head.next); return true; } //移除連結串列表尾元素 public boolean removeLast() { removeNode(head.prev); return true; } //取到指定位置的元素值 public Object get(int index) { return getNode(index).value; } //返回連結串列的大小 public int size() { return size; } public String toString() { StringBuffer s = new StringBuffer("["); Node node = head; for (int i = 0; i < size; i++) { node = node.next; if (i > 0) s.append(", "); s.append(node.value); } s.append("]"); return s.toString(); } //以下是實現方法 //查詢連結串列元素 private Node getNode(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); Node node = head.next; for (int i = 0; i < index; i++) node = node.next; return node; } //在某元素之前新增元素 private void addBefore(Node newNode, Node node) { newNode.prev = node.prev; newNode.next = node; newNode.next.prev = newNode; newNode.prev.next = newNode; size++; } //在某元素之後新增元素 private void addAfter(Node newNode, Node node) { newNode.prev = node; newNode.next = node.next; newNode.next.prev = newNode; newNode.prev.next = newNode; size++; } //移除特定元素 private void removeNode(Node node) { node.next.prev = node.prev; node.prev.next = node.next; node.prev = null; node.next = null; size--; } } //有些地方還可以優化,比如查詢時可以判斷索引是否大於size的一半,如果是的話,就從另一頭開始迭代。

測試類:

public class Test  
{  
public static void main(String[] args)  
{  
  DoubleLinkedList dll = new DoubleLinkedList();  
  //新增  
  dll.add("A");  
  dll.add("B");  
  dll.add("C");  
  System.out.println(dll);  

  //新增到最前  
  dll.addFirst("D");  
  System.out.println(dll);  

  //新增到最後 
  dll.addLast("E");  
  System.out.println(dll);

  //新增到指定位置  
  dll.add(4, "F");  
  System.out.println(dll);  

  //移除最前的  
  dll.removeFirst();  
  System.out.println(dll);  

  //移除最後的  
  dll.removeLast();  
  System.out.println(dll);  

  //移除指定位置上的  
  dll.remove(2);  
  System.out.println(dll);  

  //返回指定位置上的元素  
  System.out.println(dll.get(1));  

}  
}  

Java實現的連結串列和c/c++有點不一樣的地方是c/c++用的是指標,而Java用的是引用,這裡的區別希望大家注意一下。

相關推薦

資料結構雙向連結串列JAVA實現

歡迎轉載,請附出處: http://blog.csdn.net/as02446418/article/details/47114711 最近重新複習了一些基礎的資料結構,發覺自己好多已經淡忘了,索性重新撿起來以前的知識,今天筆者回顧了一下連結串列的知識,用J

Java手寫LinkedList 應用資料結構雙向連結串列

作為Java程式設計師,紮實的資料結構演算法能力是必須的 LinkedList理解的最好方式是,自己手動實現它         ArrayList和LinkedList是順序儲存結構和鏈式儲存結構的表在java語言中的實現.   ArrayList提供了一種可增長陣

資料結構-連結串列java實現

/** * 連結串列節點定義 * */ private class Node { private Object data; private Node next; public Node getNext() { return next;

1.6 python資料結構雙向連結串列/迴圈連結串列——以OrderedDict資料結構為例

在連結串列這一部分的最後,我們以python中十分強大的collections包中的OrderedDict為例,看一下雙向迴圈列表的功能實現。 OrderedDict 它提供了有序的dict結構,因此他不是常規的雜湊雜湊表,為了保證儲存物件有序,它用連結串列實現了這一功能,

資料結構單向連結串列C++語言描述

該檔案是整個原始檔,包括單向連結串列節點的定義,各種操作函式,main()測試用例。 #include <iostream> using namespace std; struct ListNode //用class時需要加publi

資料結構---自定義單向連結串列Java實現

單向連結串列是指每一個節點記憶體在一個指向下一個節點的指標,java中就是節點存在指向下一個節點的物件引用 下面是Node節點類 public class Node { private Object object; private Node next;

資料結構-雙向連結串列Python實現

資料結構在程式設計世界中一直是非常重要的一環,不管是開發還是演算法,哪怕是單純為了面試,資料結構都是必修課,今天我們介紹連結串列中的一種——雙向連結串列的程式碼實現。 好了,話不多說直接上程式碼。 雙向連結串列 首先,我們定義一個節點類:Node class Node: def __init__(se

劍指offer從尾到頭列印連結串列Java實現

從尾到頭列印連結串列 NowCoder 題目描述: 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 ###解題思路: 解法一:利用遞迴 import java.util.ArrayList; public class Solution {

UVA-12657 Boxes in a Line (模擬,雙向連結串列陣列實現)

第一次對陣列實現雙向連結串列的練習,理解了發現數組實現真方便… 題目:UVA-12657 題目描述: 你有n個盒子在桌子上的一條線上從左到右編號為1……n。你的任務是模擬四種操作 1 X Y 移動盒子編號X到盒子編號Y的左邊(如果X已經在Y的左邊了就忽略) 2 X Y 移

LeetCode第23題:合併K個有序連結串列JAVA實現

題目: 我的解答: 思路很簡單,把所有的資料先讀到ArrayList中然後轉到陣列中,然後排序,然後構建新連結串列 程式碼: /** * Definition for singly-linked list. * public class ListNode {

leetcode206. 反轉連結串列java實現

題目:反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 思路: 迭代:讓當前節點的下一個節點是前節點,然後當前節點和下一個節點分別往後移。

劍指offer面試題6:從尾到頭列印連結串列Java實現

題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 思路:因為要實現從頭到尾遍歷,然後從尾到頭列印,也就是說第一個遍歷到的最後一個列印,最後遍歷到的第一個列印,這很明顯符合棧 “先進後出” 的特點,所以我們可以利用棧來實現這種順序。 測試用例: 功能測試:

雙向連結串列c++實現

  單向連結串列的缺點:逆序訪問單向連結串列中的資料元素,效率低下。   若從頭節點開始依次訪問單向連結串列的元素,可使用m_current遊標,但是逆序訪問,只能通過下面程式碼實現訪問: int main(void) { LinkList<i

超詳細動手編寫-連結串列Java實現

[TOC] ## 前言 在前面的實現的動手寫個Java動態數組裡,雖然對於使用者而言,看是實現了動態擴容的功能,實際上,只是依託底層寫的方法`ensureCapacity`在陣列容量不足的時候,對重新申請一個原陣列1.5倍容量的新陣列,再將原有陣列中存放的元素複製到新陣列來,陣列指標指向新陣列,從根本上來說

(超詳細) 動手編寫 — 連結串列 Java實現

[TOC] ## 前言 在前面的實現的動手寫個Java動態數組裡,雖然對於使用者而言,看是實現了動態擴容的功能,實際上,只是依託底層寫的方法`ensureCapacity`在陣列容量不足的時候,對重新申請一個原陣列1.5倍容量的新陣列,再將原有陣列中存放的元素複製到新陣列來,陣列指標指向新陣列,從根本上來說

大話資料結構——雙向連結串列java實現

在實現了單向連結串列後,我們在使用單向連結串列中會發現一個問題:在單向連結串列中查詢某一個結點的下一個結點的時間複雜度是O(1),但是查詢這個結點的上一個結點的時候,時間複雜度的最大值就變成了O(n),因為在查詢這個指定結點的上一個結點時又需要從頭開始遍歷。 那麼該如何解決這個困難呢?

Redis系列資料結構List雙向連結串列中阻塞版本BLPOP、BRPOP和LINDEX、LINSERT、LRANGE命令詳解

1.BRPOP、BLPOP BLPOP: BLPOP 是阻塞式列表的彈出原語。 它是命令 LPOP 的阻塞版本,這是因為當給定列表內沒有任何元素可供彈出的時候, 連線將被 BLPOP 命令阻塞。 當給定多個 key 引數時,按引數 key 的先後順序依次檢查

Java資料結構迴圈連結串列實現

簡介 在指定結點後新增一個結點 刪除指定結點的下一個結點 獲取下一個結點 獲取結點資料 public class LoopNode { int data;//資料域 LoopNode next;//下一個結點 public Loop

C語言資料結構靜態連結串列實現A-BUB-A)

時間複雜度O(3n)不是很難,直接貼程式碼:StaticLinkList.h#ifndef _STATIC_LINK_LIST_H_ #define _STATIC_LINK_LIST_H_ #define MAXSIZE 100 typedef enum {ERROR,OK

Redis系列資料結構List雙向連結串列中基本操作操作命令和原始碼解析

1.介紹 Redis中List是通過ListNode構造的雙向連結串列。 特點: 1.雙端:獲取某個結點的前驅和後繼結點都是O(1) 2.無環:表頭的prev指標和表尾的next指標都指向NULL,對連結串列的訪問都是以NULL為終點 3.帶表頭指標和表尾指標:獲取表頭和表尾的複雜度都是O(1) 4.帶連結串