Java雙向連結串列的實現
原文地址:http://blog.csdn.net/yangchuxi/article/details/6621057
看連結串列的時候還是用c中指標那種思維來思考比較容易理解,c很久以前學的都忘得差不多了,需要補補鳥……
在上面文章所寫的基礎上拿來改了下,新增了類似list集合get()方法,直接通過索引得到節點物件,節點物件裡的Object成員變數就是用來儲存資料,可以在這個基礎你在自己封裝一下,我就部封裝鳥……
/**
* @Description : 描述
* @author YangXuan
* @email 364105996@qq.com
* @date 2013-11-28 上午12:35:19
*/
public class TWLink {
/**
* @Description : 節點實體
*/
@SuppressWarnings("hiding")
class Node<Object> {
private Object object;
private Node<Object> next;
private Node<Object> pre;
public Node(Object object) {
this.object = object;
this.next = null;
this.pre = null;
}
public String toString() {
return object.toString();
}
}
private Node<Object> head;
private int size;
/**
* 連結串列的初始化
*/
public TWLink() {
size = 0;
head = new Node<Object>(null);
head.next = null;
head.pre = null;
}
/**
* 插入到連結串列前段(表頭之後)
*/
public boolean insertFirst(Node<Object> node) {
if (node != null) {
if (head.next != null) {
node.pre = head;
node.next = head.next;
head.next.pre = node;
head.next = node;
} else {
head.next = node;
node.pre = head;
}
size++;
return true;
}
return false;
}
/**
* 插入到連結串列的末尾
*/
public boolean insertLast(Node<Object> node) {
if (node != null) {
Node<Object> current = head;
while (current.next != null) {
current = current.next;
}
current.next = node;
node.pre = current;
size++;
return true;
}
return false;
}
/**
* 在指定節點node1後插入節點node2
*/
public boolean insertInto(Node<Object> node1, Node<Object> node2) {
if (node1 != null && node2 != null) {
// 先遍歷這個連結串列,看看有沒有等於node1
Node<Object> current = head;
while (current != node1) {
current = current.next;
if (current == null) {
System.out.println("不存在節點 " + node1.toString() + ",無法插入節點 "
+ node2.toString());
return false;
}
}
// 此時的current如果是最後一個節點,這呼叫 insertLast()方法插入到最後
if (current.next == null) {
insertLast(node2);
size++;
return true;
}
node2.pre = current;
node2.next = current.next;
current.next.pre = node2;
current.next = node2;
size++;
return true;
}
return false;
}
/**
* 刪除連結串列前端節點
*/
public boolean deleteHead() {
if (head.next != null) {
if (head.next.next != null) {
// Node<Object> current = head.next;
// head.next = current.next;
// current.next.pre = head;
// current = null;
head.next = head.next.next;
head.next.pre = head;
size--;
return true;
} else {
head.next = null;
size--;
}
}
return false;
}
/**
* 刪除尾節點
*/
public void deleteEnd() {
Node<Object> current = head;
while (current.next != null) {
current = current.next;
}
// Node<Object> pre = current.pre;
// pre.next = null;
// current = null;
current.pre.next = null;
size--;
}
/**
* 刪除指定節點
*/
public boolean deleteNode(Node<Object> node) {
if (node != null) {
Node<Object> current = head;
while (current != node) {
current = current.next;
if (current == null) {
return false;
}
}
if (node == head.next) {
return deleteHead();
}
// 儲存與node相等的值
Node<Object> acurrent = current;
while (current.next != null) {
current = current.next;
}
if (current == node) {
deleteEnd();
return true;
}
Node<Object> pre = acurrent.pre;
Node<Object> next = acurrent.next;
pre.next = next;
next.pre = pre;
acurrent = null;
size--;
return true;
}
return false;
}
public Node<Object> get(int index) {
if (index < 0 || index >= size) {
System.out.println("索引超過範圍!");
throw new IllegalAccessError("索引超過範圍!");
}
Node<Object> current = head;
for (int i = 0; i < size - index; i++) {
current = current.next;
}
return current;
}
/**
* 連結串列長度
*/
public int getSize() {
return size;
}
/**
* 正序和反序遍歷遍歷連結串列並列印
*/
public void display() {
Node<Object> current = head.next;
if (current != null) {
Node<Object> tail = null;
System.out.println("正序輸出:");
while (current != null) {
System.out.println(current.toString());
tail = current;
current = current.next;
}
System.out.println("反序輸出:");
while (tail != head) {
if (tail != null) {
System.out.println(tail.toString());
}
tail = tail.pre;
}
System.out.println("連結串列大小:" + getSize());
} else {
System.out.println("連結串列為空!");
}
}
@Test
public void myTest() {
TWLink twl = new TWLink();
Node<Object> node1 = new Node<Object>("AAA");
Node<Object> node2 = new Node<Object>("BBB");
Node<Object> node3 = new Node<Object>("CCC");
Node<Object> node4 = new Node<Object>("DDD");
twl.insertFirst(node1);
twl.insertFirst(node2);
twl.insertFirst(node3);
twl.insertFirst(node4);
twl.display();
for (int i = 0; i < twl.getSize(); i++) {
System.out.println(twl.get(i).toString());
}
}
}
順帶附一張草稿圖便於理解
相關文章
- java實現雙向連結串列Java
- 實現雙向連結串列
- Go實現雙向連結串列Go
- JAVA基礎:語言中連結串列和雙向連結串列的實現(轉)Java
- 雙向連結串列的功能實現(初版
- 連結串列-雙向連結串列
- 資料結構(雙向連結串列的實現)資料結構
- C++實現通用雙向連結串列C++
- 雙向連結串列
- MYSQL INNODB 中通用雙向連結串列的實現MySql
- javascript中的連結串列結構—雙向連結串列JavaScript
- 資料結構-雙向連結串列(Python實現)資料結構Python
- python 資料結構之雙向連結串列的實現Python資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 雙向迴圈連結串列基本操作的實現(C語言)C語言
- go 實現單向連結串列Go
- 資料結構——雙向連結串列資料結構
- 資料結構:雙向連結串列資料結構
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- Java實現單向連結串列基本功能Java
- C語言之雙向連結串列C語言
- 單向迴圈連結串列的實現
- 雙向連結串列的建立及基本操作
- 資料結構之雙向連結串列資料結構
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- 雙向連結串列 尾節點插入
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- C 語言使用非迴圈雙向連結串列實現佇列佇列
- 雙向連結串列的操作(插入和刪除)
- 演算法與資料結構-連結串列((linked-list)-Java實現單向連結串列演算法資料結構Java
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 連結串列-單連結串列實現
- java實現連結串列反轉Java
- 畫江湖之資料結構【第一話:連結串列】雙向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 雙向連結串列資料結構
- 把BST轉換為雙向連結串列
- 【c# .net】雙向連結串列( LinkedList )C#