雙向鏈表
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點
雙向鏈表比單鏈表多了一個前驅這裏我們直接上代碼
代碼實現
//雙向鏈表
public class TwoWayLinkListTest {
public static void main(String[] args) {
TWLinkNode linkNode1 = new TWLinkNode(1);
TWLinkNode linkNode2 = new TWLinkNode(2);
TWLinkNode linkNode3 = new TWLinkNode(3);
TWLinkNode linkNode4 = new TWLinkNode(4);
TwoWayLinkList twoWayLinkList = new TwoWayLinkList();
twoWayLinkList.insert(linkNode1);
twoWayLinkList.insert(linkNode2);
twoWayLinkList.insert(linkNode3);
twoWayLinkList.insert(linkNode4);
System.out.println("插入數據後遍歷");
twoWayLinkList.showLink();
System.out.println("雙向鏈表長度爲:"+twoWayLinkList.LinkListLength());
//修改位置爲2的節點
twoWayLinkList.update(2, 6);
System.out.println("修改位置爲2的節點讓他的值爲6數據後遍歷");
twoWayLinkList.showLink();
System.out.println("修改位置爲6的節點讓他的值爲6數據後遍歷");
twoWayLinkList.update(6, 6);
twoWayLinkList.showLink();
//查找位置爲2的節點
System.out.println("查找數據後返回");
twoWayLinkList.select(4);
System.out.println("開始刪除 刪除節點5:");
twoWayLinkList.delete(5);
twoWayLinkList.showLink();
System.out.println("開始刪除 刪除節點3:");
twoWayLinkList.delete(3);
twoWayLinkList.showLink();
//twoWayLinkList.showLink();
System.out.println("雙向鏈表長度爲:"+twoWayLinkList.LinkListLength());
System.out.println("開始反轉鏈表");
showLink(reserveLink(twoWayLinkList.getHead()));
//反轉雙向鏈表
}
public static TWLinkNode reserveLink(TWLinkNode head){
// if(head.next==null) {
// System.out.println("雙向鏈表爲空");
// }
TWLinkNode q = null;
TWLinkNode p = null;
while(true) {
p = head.next;
head.next = q;
head.pre = p;
q = head;
head = p;
if (head==null) {
break;
}
}
return q;
}
public static void showLink(TWLinkNode head) {
//定義一個輔助變量進行遍歷
if(head.next==null) {
System.out.println("雙向鏈表爲空");
return;
}
TWLinkNode temp = head;
while(true) {
if(temp.next==null) {
break;
}
System.out.println(temp.data);
temp = temp.next;
}
}
}
class TWLinkNode{
public int data;
public TWLinkNode next;
public TWLinkNode pre;
@Override
public String toString() {
return "LinkNode [data=" + data + "]";
}
public TWLinkNode(int data) {
this.data = data;
}
}
class TwoWayLinkList{
private TWLinkNode head = new TWLinkNode(0);
//遍歷
public void showLink() {
//定義一個輔助變量進行遍歷
if(head.next==null) {
System.out.println("雙向鏈表爲空");
return;
}
TWLinkNode temp = head.next;
while(true) {
if(temp==null) {
break;
}
System.out.println(temp.data);
temp = temp.next;
}
}
//插入
public void insert(TWLinkNode node) {
TWLinkNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
node.pre = temp;
}
//查找
public void select(int index) {
if(head.next==null) {
System.out.println("雙向鏈表爲空");
return;
}
if (index>LinkListLength() || index<=0) {
System.out.println("超過雙向鏈表範圍,無法修改");
return;
}
TWLinkNode temp = head.next;
boolean flag = true;
//創造一個計數器
int count = 1;
while(flag) {
if (index == count) {
flag = false;
break;
}
count++;
temp = temp.next;
}
System.out.println(temp.data);
}
//修改
public void update(int index,int value) {
if(head.next==null) {
System.out.println("雙向鏈表爲空");
return;
}
if (index>LinkListLength() || index<=0) {
System.out.println("超過雙向鏈表範圍");
return;
}
TWLinkNode temp = head;
for (int i = 1; i <=LinkListLength(); i++) {
temp = temp.next;
if(i==index) {
temp.data = value;
break;
}
if(temp.next==null) {
System.out.println("未找到目標位置");
}
}
}
//刪除
public void delete(int index) {
if(head.next == null) {
System.out.println("單鏈表爲空");
return;
}
if (index>LinkListLength() || index<=0) {
System.out.println("刪除的節點超過雙向鏈表範圍");
return;
}
TWLinkNode temp = head;
for (int i = 1; i <=LinkListLength(); i++) {
temp = temp.next;
if(i == index) {
temp.pre.next = temp.next;
if (temp.next != null) {
temp.next.pre = temp.pre;
}
break;
}
}
}
//得到雙向鏈表長度
public int LinkListLength() {
if(head.next==null) {
System.out.println("雙向鏈表爲空");
return 0;
}
TWLinkNode temp = head;
int count = 0;
while (true) {
if(temp.next == null) {
//System.out.println();
break;
}
temp = temp.next;
count++;
}
return count;
}
public TWLinkNode getHead() {
return head;
}
}