<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
從今天開始, 小白我將帶大家開啟 Jave 資料結構 & 演演算法的新篇章.
連結串列 (Linked List) 是一種遞迴的動態資料結構. 連結串列以線性表的形式, 在每一個節點存放下一個節點的指標. 連結串列解決了陣列需要先知道資料大小的缺點, 增加了節點的指標域, 空間開銷較大.
連結串列包括三類:
單向連結串列 (Single Linked List) 是連結串列中最簡單的一種形式. 單向連結串列每個節點包含兩個部分, 第一部分是資訊, 第二部分是下一個節點. (元素 + 指標)
// Node類 private class Node { public E e; // 元素 private SingleLinkedList.Node next; // 下一個節點 // 構造 public Node(E e) { this.e = e; this.next = null; } @Override public String toString() { return e.toString(); } }
// 新增資料 public void add(int index, E e) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 SingleLinkedList.Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } // 新增資料 SingleLinkedList.Node node = new SingleLinkedList.Node(e); node.next = prev.next; prev.next = node; size++; }
// 刪除資料 public void remove(int index) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } // 刪除資料 Node retNode = prev.next; prev.next = retNode.next; size --; }
// 通過索引獲取連結串列數資料 public E get(int index) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node cur = dummyHead.next; for (int i = 0; i < index; i++) { cur = cur.next; } return cur.e; }
// 通過索引設定連結串列資料 public E set(int index,E e) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node cur = dummyHead.next; for (int i = 0; i < index; i++) { cur = cur.next; } // 設定新值 cur.e = e; return cur.e; }
// 連結串列是否包含元素 public boolean contains(E e) { Node cur = dummyHead.next; // 遍歷所有節點 while (cur != null) { if (cur.e.equals(e)) { return true; } cur = cur.next; } return false; }
// main public static void main(String[] args) { // 建立單向連結串列 SingleLinkedList<Integer> singleLinkedList = new SingleLinkedList<>(); // 新增資料 for (int i = 0; i < 8; i++) { singleLinkedList.addFirst(i); System.out.println(singleLinkedList); } // 是否包含元素 System.out.println(singleLinkedList.contains(0)); System.out.println(singleLinkedList.contains(10)); // set singleLinkedList.set(0, 9); singleLinkedList.set(1, 7); System.out.println(singleLinkedList); // 刪除資料 for (int i = 0; i < 8; i++) { singleLinkedList.remove(0); System.out.println(singleLinkedList); } }
輸出結果:
0->NULL
1->0->NULL
2->1->0->NULL
3->2->1->0->NULL
4->3->2->1->0->NULL
5->4->3->2->1->0->NULL
6->5->4->3->2->1->0->NULL
7->6->5->4->3->2->1->0->NULL
true
false
9->7->5->4->3->2->1->0->NULL
7->5->4->3->2->1->0->NULL
5->4->3->2->1->0->NULL
4->3->2->1->0->NULL
3->2->1->0->NULL
2->1->0->NULL
1->0->NULL
0->NULL
NULL
public class SingleLinkedList<E> { private Node dummyHead; // 頭指標 private int size; // 連結串列大小 // Node類 private class Node { public E e; // 元素 private Node next; // 下一個節點 // 構造 public Node(E e) { this.e = e; this.next = null; } @Override public String toString() { return e.toString(); } } // 構造 public SingleLinkedList() { dummyHead = new Node(null); size = 0; } // 表首新增元素 public void addFirst(E e) { add(0, e); } // 表尾新增元素 public void addLast(E e){ add(size, e); } // 新增資料 public void add(int index, E e) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } // 新增資料 Node node = new Node(e); node.next = prev.next; prev.next = node; size ++; } // 刪除資料 public void remove(int index) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } // 刪除資料 Node retNode = prev.next; prev.next = retNode.next; size --; } // 通過索引獲取連結串列數資料 public E get(int index) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node cur = dummyHead.next; for (int i = 0; i < index; i++) { cur = cur.next; } return cur.e; } // 通過索引設定連結串列資料 public E set(int index,E e) { // 檢查索引是否越界 if (index < 0 || index > size) { throw new RuntimeException("Invalid Index"); } // 獲取index前一個節點 Node cur = dummyHead.next; for (int i = 0; i < index; i++) { cur = cur.next; } // 設定新值 cur.e = e; return cur.e; } // 連結串列是否包含元素 public boolean contains(E e) { Node cur = dummyHead.next; // 遍歷所有節點 while (cur != null) { if (cur.e.equals(e)) { return true; } cur = cur.next; } return false; } // 獲取連結串列大小 public int getSize() { return size; } // 判斷連結串列是否為空 public boolean isEmpty() { return size == 0; } @Override public String toString() { StringBuilder builder = new StringBuilder(); Node cur = dummyHead.next; while (cur != null) { builder.append(cur + "->"); cur = cur.next; } builder.append("NULL"); return builder.toString(); } // main public static void main(String[] args) { // 建立單向連結串列 SingleLinkedList<Integer> singleLinkedList = new SingleLinkedList<>(); // 新增資料 for (int i = 0; i < 8; i++) { singleLinkedList.addFirst(i); System.out.println(singleLinkedList); } // 是否包含元素 System.out.println(singleLinkedList.contains(0)); System.out.println(singleLinkedList.contains(10)); // set singleLinkedList.set(0, 9); singleLinkedList.set(1, 7); System.out.println(singleLinkedList); // 刪除資料 for (int i = 0; i < 8; i++) { singleLinkedList.remove(0); System.out.println(singleLinkedList); } } }
到此這篇關於Java 資料結構與演算法系列精講之單向連結串列的文章就介紹到這了,更多相關Java 單向連結串列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45