2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)
生活随笔
收集整理的這篇文章主要介紹了
2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class DoubleLinkedListZH<E> {//調用方法參數是index的記得檢測是否在合法范圍(0~size-1)內,可以寫一個arrangeCheck函數,我懶了,默認輸入合法//雙向鏈表,一個結點前后兩個指針//雙向鏈表相比單鏈表,add方法和remove方法大改,分四到三種情況,比較重要,時刻注意空指針報錯//clear方法的實際意義涉及到java 的內存管理機制,也可以好好回顧//tostring也改了一下,sout(node)本質是調用node的toString函數,重寫toString函數真的很實用,StringBuilder的用法也需要掌握public static final int ELEMENT_NOT_FOUND = -1;private int size;//定義全局變量(不在函數里的)不初始化默認初始值為0,局部變量則初始值隨機private DoubleLinkedListZH.Node<E> headNode;private DoubleLinkedListZH.Node<E> lastNode;private static class Node<E> {E element;DoubleLinkedListZH.Node<E> next = null;DoubleLinkedListZH.Node<E> prev = null;//JAVA把指針淡化了,C中需要Node *p = next;next -> nextNode;,Java中只要next=nextNode就可以了public Node(DoubleLinkedListZH.Node<E> prev ,E element, DoubleLinkedListZH.Node<E> next) {this.element = element;this.prev = prev;this.next = next;}public Node() {}@Override//重寫了toString函數,輸出:null<-0->1 一個結點及其前后指針和對應結點public String toString() {StringBuilder sb = new StringBuilder();if (prev!=null){sb.append(prev.element);}else{sb.append("null");}sb.append("<-").append(element).append("->");if (next!=null){sb.append(next.element);}else{sb.append("null");}return sb.toString() ;}}//非gc boot對象,即沒有被棧指針或棧指針間接指向的對象,就被自動回收了public void clear(){headNode = null;lastNode = null;size = 0;}public void isEmptyPrint(){if (headNode == null){System.out.println("Empty");}else{System.out.println("Not Empty");}}//是否包含,一定記得看看有沒有多余句子寫到循環里了public void containsPrint(E element){DoubleLinkedListZH.Node<E> node = headNode;for(int i = 0;i < size ; i++){if (node.element == element){System.out.println("Contain");return;}node = node.next;}System.out.println("Not Contain");}//雙向鏈表add,實際上有四種情況,分別是鏈表全空時插入,鏈表非空在頭結點前插入,鏈表非空在尾結點后插入,鏈表非空在非頭尾結點插入//時刻注意空指針錯誤!!!尤其鏈表題public void add(int index , E element){DoubleLinkedListZH.Node<E> node = new Node<>();node.element = element;if (size == 0){headNode = node;lastNode = node;}else if (index == 0){node.next = headNode;headNode.prev = node;headNode = node;node.prev = null;}else if (index == size){node.prev = lastNode;lastNode.next = node;lastNode = node;node.next = null;}else {DoubleLinkedListZH.Node cur = indexSearchNode(index);node.next = cur;node.prev = cur.prev;cur.prev.next = node;cur.prev = node;}size++;}public void remove(int index){DoubleLinkedListZH.Node<E> node = indexSearchNode(index);if(node.prev == null){headNode = node.next;node.next.prev = null;}if (node.next == null){node.prev.next = null;lastNode = node.prev;}else {node.prev.next = node.next;node.next.prev = node.prev;}size--;}public void add(E element){add(size,element);}//根據索引返回對應結點,注意返回值是Node<E>而不是E,該函數經常在別的函數內使用//注意這里是雙向鏈表的優勢之一,按index查找結點的平均時間要少,因為可以從兩邊往中間找,最壞就是在中間private DoubleLinkedListZH.Node<E> indexSearchNode (int index){DoubleLinkedListZH.Node node = new Node();if(index <= size / 2){node = headNode;for (int i = 0; i<index; i++){node = node.next;}}else{node = lastNode;for (int i = size - 1; i > index ; i--){node =node.prev;}}return node;}public String toString() {StringBuilder string = new StringBuilder();string.append("size=").append(size).append(" [");DoubleLinkedListZH.Node<E> node = headNode;for (int i = 0; i < size; i++) {if (i != 0) {string.append(", ");}string.append(node);node = node.next;}string.append("]");return string.toString();}}
總結
以上是生活随笔為你收集整理的2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-9-下旬 数据结构-线性表-链
- 下一篇: 2021-9-下旬 数据结构 - 线性表