java數據結構基礎:單鏈表與雙向鏈表
單鏈表:
每個數據是以節點的形式存在的
每個節點分為數據域和指針域
數據域中保存該節點的數據
指針域中保存指向下一個節點的指針
實現思路:
節點類SingleNode中保存數據和指向下一個節點的指針
單鏈表類SingleLinkedList中保存鏈表的頭節點,實現相關鏈表方法
對於鏈表方法,涉及到位置查找,如在指定位置增加、刪除節點,需要使用一個臨時變量temp從頭節點開始遍歷,直至找到對應的位置。
對於節點的增加刪除,隻需要修改相關結點的指針指向即可
代碼實現:
節點類SingleNode:
public class SingleNode { public int data; public SingleNode next; public SingleNode(int data) { this.data = data; } @Override public String toString() { return "SingleNode{" + "data=" + data + '}'; } }
單鏈表類SingleLinkedList:
public class SingleLinkedList { private SingleNode head = new SingleNode(0); //獲取頭結點 public SingleNode getHead(){ return head; } //添加節點 public void add(SingleNode singleNode) { SingleNode temp = head; //找到鏈表最後一個節點 while (temp.next != null) { temp = temp.next; } temp.next = singleNode; } //按順序添加節點 public void addByOrder(SingleNode singleNode) { SingleNode temp = head; while (true) { if (temp.next == null) { //已經遍歷到鏈表最後瞭 break; } else if (temp.next.data > singleNode.data) { //找到應插入的位置 break; } temp = temp.next; } singleNode.next = temp.next; temp.next = singleNode; } //刪除節點 public void delete(int data) { SingleNode temp = head; boolean flag = false; //標志是否找到待刪除節點的前一個節點 while (true) { if (temp.next == null) { //已經遍歷到鏈表最後瞭 break; } else if (temp.next.data == data) { //找到待刪除節點的前一個節點 flag = true; break; } temp = temp.next; } if (flag) { temp.next = temp.next.next; } else { System.out.println("要刪除的節點不存在"); } } //輸出鏈表 public void show() { //判斷鏈表是否為空 if (head.next == null) { System.out.println("鏈表為空"); return; } SingleNode temp = head.next; while (temp != null) { System.out.println(temp); temp = temp.next; } } }
雙向鏈表:
每個節點中除瞭保存瞭指向後一個節點的指針外,還保存瞭指向前一個節點的指針
實現思路:
相關方法實現與單鏈表類似,不同點在於需要增加對指向前一個節點的指針的更改
代碼實現:
節點類DoubleNode:
public class DoubleNode { public int data; public DoubleNode next; public DoubleNode pre; public DoubleNode(int data) { this.data = data; } @Override public String toString() { return "DoubleNode{" + "data=" + data + '}'; } }
雙向鏈表類DoubleLinkedList:
public class DoubleLinkedList { public DoubleNode head = new DoubleNode(0); //獲取頭結點 public DoubleNode getHead() { return head; } //添加節點 public void add(DoubleNode doubleNode) { DoubleNode temp = head; //找到鏈表最後一個節點 while (temp.next != null) { temp = temp.next; } temp.next = doubleNode; doubleNode.pre = temp; } //刪除節點 public void delete(int data) { DoubleNode temp = head.next; boolean flag = false; //標志是否找到待刪除節點的前一個節點 while (true) { if (temp == null) { //已經遍歷到鏈表最後瞭 break; } else if (temp.data == data) { //找到待刪除節點 flag = true; break; } temp = temp.next; } if (flag) { temp.pre.next = temp.next; if (temp.next != null) { //若刪除節點不為最後一個節點 temp.next.pre = temp.pre; } } else { System.out.println("要刪除的節點不存在"); } } //輸出鏈表 public void show() { //判斷鏈表是否為空 if (head.next == null) { System.out.println("鏈表為空"); return; } DoubleNode temp = head.next; while (temp != null) { System.out.println(temp); temp = temp.next; } } }
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!