Java連結串列基本操作小總結
阿新 • • 發佈:2019-02-12
工作以來一直都忽略Java連結串列的簡單程式設計,在自己簡單的書寫後,發現其實連結串列也蠻好理解的。再簡單的資料結構也要自己手動敲敲,不然會反應遲鈍的~
package com.study.list; /** * @program: TwoReverseLinedList * @description: 兩個節點反轉 * @author: * @create: 2018-11-14 11:10 **/ public class TwoReverseLinedList<T> { private int size; private LinkNode<T> head; private LinkNode<T> tail; public static void main(String[] args) { TwoReverseLinedList<Integer> twoReverseLinedList = new TwoReverseLinedList<Integer>(); for (int i = 0; i < 10; i++) { twoReverseLinedList.addByTail(i); } twoReverseLinedList.printLinkList(); System.out.println(); System.out.println("獲取元素是:" + twoReverseLinedList.get(0)); System.out.println("該連結串列長度:" + twoReverseLinedList.size()); twoReverseLinedList.reverse(); System.out.println("方法一反轉後的連結串列"); twoReverseLinedList.printLinkList(); System.out.println(); twoReverseLinedList.reverse1(); System.out.println("方法二反轉後的連結串列"); twoReverseLinedList.printLinkList(); System.out.println(); System.out.println("刪除指點節點後的連結串列"); twoReverseLinedList.delete(0); twoReverseLinedList.printLinkList(); System.out.println(); System.out.println("新增指點節點後的連結串列"); twoReverseLinedList.insert(0, 100); twoReverseLinedList.printLinkList(); } /** * 增加節點 頭插法,head總是指向最新節點 * * @param data */ public void addByHead(T data) { if (null == this.head) { this.head = new LinkNode<T>(); } LinkNode<T> newNode = new LinkNode<T>(); newNode.setData(data); newNode.setNext(head); head = newNode; size++; } /** * 增加節點 * * @param data */ public void addByTail(T data) { if (null == this.head) { this.head = new LinkNode<T>(); this.tail = this.head; } LinkNode<T> newNode = new LinkNode<T>(); newNode.setData(data); tail.setNext(newNode); tail = newNode; size++; } /** * 列印連結串列 */ public void printLinkList() { if (null == head) { return; } LinkNode<T> tmp = head.getNext(); System.out.print("連結串列如下: "); while (null != tmp) { System.out.print(tmp.getData() + "->"); tmp = tmp.getNext(); } } /** * 獲取資料 * * @param index * @return */ public T get(int index) { if (null == head) { throw new IllegalArgumentException("連結串列不存在"); } if (-1 > index || index > size - 1) { throw new IllegalArgumentException("獲取位置異常"); } if (-1 == index) { return null; } LinkNode<T> tmp = head.getNext(); int count = 0; while (null != tmp) { if (count++ == index) { return tmp.getData(); } tmp = tmp.getNext(); } return null; } /** * 獲取指定節點 * * @param index * @return */ public LinkNode<T> getNode(int index) { if (null == head) { throw new IllegalArgumentException("連結串列不存在"); } if (-1 > index || index > size - 1) { throw new IllegalArgumentException("獲取位置異常"); } if (-1 == index) { return head; } LinkNode<T> tmp = head.getNext(); int count = 0; while (null != tmp) { if (count++ == index) { return tmp; } tmp = tmp.getNext(); } return null; } /** * 返回列表的長度 * * @return */ public int size() { return this.size; } /** * 反轉-值交換 */ public void reverse() { if (null == head) { return; } LinkNode<T> first = head.getNext(); LinkNode<T> tmp; // 交換值實現 while (null != first && null != first.getNext()) { tmp = first.getNext(); T tmpData = first.getData(); first.setData(tmp.getData()); tmp.setData(tmpData); first = tmp.getNext(); } } /** * 反轉-節點交換 */ public void reverse1() { if (null == head) { return; } LinkNode<T> first = head.getNext(); LinkNode<T> base = head; LinkNode<T> second; // 交換值實現 while (null != first && null != first.getNext()) { second = first.getNext(); base.setNext(second); first.setNext(second.getNext()); second.setNext(first); base = first; first = first.getNext(); } } /** * 刪除指點的節點 * * @param i */ public void delete(int i) { LinkNode<T> node = getNode(i); if (null == node) { throw new IllegalArgumentException("刪除的目標節點不存在"); } LinkNode<T> pre = getNode(i - 1); pre.setNext(node.getNext()); size--; } /** * 指定位置插入 * * @param data */ public void insert(int index, T data) { if (null == head) { return; } LinkNode<T> node = getNode(index - 1); if (null == node) { throw new IllegalArgumentException("插入位置有誤"); } LinkNode<T> tmp = new LinkNode<T>(); tmp.setData(data); tmp.setNext(node.getNext()); node.setNext(tmp); size++; } /** * 節點 * * @param <T> */ class LinkNode<T> { /** * 資料域 */ private T data; /** * 指標域 */ private LinkNode next; public LinkNode() { } public LinkNode(T data) { this.data = data; } public T getData() { return data; } public void setData(T data) { this.data = data; } public LinkNode getNext() { return next; } public void setNext(LinkNode next) { this.next = next; } } }
執行結果:
連結串列如下: 0->1->2->3->4->5->6->7->8->9->
獲取元素是:0
該連結串列長度:10
方法一反轉後的連結串列
連結串列如下: 1->0->3->2->5->4->7->6->9->8->
方法二反轉後的連結串列
連結串列如下: 0->1->2->3->4->5->6->7->8->9->
刪除指點節點後的連結串列
連結串列如下: 1->2->3->4->5->6->7->8->9->
新增指點節點後的連結串列
連結串列如下: 100->1->2->3->4->5->6->7->8->9->