数据结构学习笔记(一):链表(linked list)
目錄
1 鏈表的概念和分類
2 鏈表對于數據的增刪查操作(以單向鏈表為例)
2.1 增刪查操作的描述
2.2 增刪查操作的代碼實現(JAVA)
1 鏈表的概念和分類
鏈表,又稱線性表或線性鏈表,是若干數據元素組成的線性序列,將數據元素像鏈條一樣組織在一起。存儲在鏈表中的數據元素被稱為結點(node),每個結點具有兩個要素:第一、數據元素的具體值,第二、指向下一個結點的指針,指針用來存儲下一個結點的內存地址。根據結點的結構,鏈表可分為單向鏈表、雙向鏈表、循環鏈表。
最基本的鏈表結構是單向鏈表,最前面是一個頭指針用來指向第一個結點,最后一個結點的指針是一個空指針(null pointer),每一個結點都只指向它的下一個結點,例如一個存儲了5個學生考試分數的鏈表:
雙向鏈表(duoble linked list)每一個結點有兩個指針,一個指向前驅結點(prev pointer),一個指向后續結點(next pointer),第一個結點的prev指針和最后一個結點的next指針都是空指針。
讓鏈表的最后一個元素指向第一個元素就構成了循環鏈表,循環鏈表也有單向和雙向兩個類型。
2 鏈表對于數據的增刪查操作(以單向鏈表為例)
2.1 增刪查操作的描述
查找元素的功能弱,速度慢:只能通過遍歷方式找到指定元素,即從鏈頭(或鏈尾)開始一個個跳轉,直到跳轉到指定元素的位置。
增刪元素的功能強,速度快:無論在哪個位置增加或刪除元素,只需改變指針指向就能實現,即修改連接的下個元素的內存地址。
- 插入元素的操作:先讓待插入結點的指針指向指定位置原來的結點,再讓指定位置前驅結點的指針指向待插入的結點。
- 刪除元素的操作:只需修改待刪除結點前驅元素的指針,讓前驅結點指針指向待刪除結點的后續結點。
?
2.2 增刪查操作的代碼實現(JAVA)
用 Java 模擬以上圖示中的鏈表操作。
MyLink.java:準備工作,創建一個鏈表類
package com.notes.data_structure1;public class MyLink {private Node headNode; // 定義一個頭結點private Node currentNode; // 定義一個當前結點// 定義一個結點類private class Node {// 結點的兩個要素:數據和指針private int data;private Node next;// 構造方法:Node實例化時給data賦值public Node(int data) {this.data = data;}}// 創建頭結點private Node addHeadNode() {// 頭結點用來模擬頭指針,數據設為0headNode = new Node(0);return headNode;}// 增加結點public void addNode(int data) {// 如果頭結點不存在,當前結點為頭結點,這樣就有了頭指針if (headNode==null) {// 當前結點是頭結點,調用創建頭結點的方法currentNode = addHeadNode();}// 創建一個新的結點Node node = new Node(data);// 當前結點的指針指向新結點currentNode.next = node;// 當前結點后移一位,新結點成為當前結點,正式加入鏈表currentNode = currentNode.next;}// 遍歷打印所有的結點(不包括頭結點)public void printLink() {// temp可以看作一個移動的指針Node temp = headNode;// 通過指針的移動遍歷數組,直到指針指向鏈尾的nullwhile(temp.next != null) {temp = temp.next;System.out.println(temp.data);}}/*** 模擬 “查” 有關的鏈表操作* 查找指定數據,返回數據所在的位置(索引)*/public void searchNode(int data) {int index = 0; // 用于計算數據位置boolean notFound = true; // 用于存儲是否找到數據// 遍歷查找指定的數據Node temp = headNode;while(temp.next != null) {temp = temp.next;index ++;if (temp.data == data) {System.out.println(data+"存儲在鏈表的第"+index+"個結點中");notFound = false;break;}}if(notFound) {System.out.println("沒有找到值為"+data+"的元素");}}/*** 模擬與 “增” 有關的操作* 從尾部添加元素可直接通過 addNode() 方法實現* 由于設置了頭結點(索引為0),從頭部插入和從中間插入的操作是一樣的* 插入的位置用 索引 描述,新結點進入該位置,其后的結點自動后移一位*/public void insertNode(int index, int data) {// 實例化待插入的新結點,傳入數據Node insertNode = new Node(90);// 用 for 定位到待插入位置的前一個結點Node prev = headNode;for(int i=0;i<index-1;i++) {prev = prev.next;}// 先讓待插入結點的指針指向指定位置原來的結點(紅色箭頭)insertNode.next = prev.next;// 再讓指定位置前驅結點的指針指向待插入的結點(綠色箭頭)prev.next = insertNode;}/*** 模擬與 “刪” 有關的操作* 這里采用按 位置(索引) 刪除的方式*/public void deleteNode(int index) {// 用 for 定位到待刪除位置的前一個結點Node prev = headNode;for(int i=0;i<index-1;i++) {prev = prev.next;}// 修改前驅結點的指針指向,讓其指向待刪除結點的后續結點prev.next = prev.next.next;} }linkdemo1.java:模擬查找與插入元素的操作
package com.notes.data_structure;public class linkDemo01 {public static void main(String[] args) {/*** 準備工作,實例化 MyLink類,并添加結點*/MyLink mylink = new MyLink();mylink.addNode(95);mylink.addNode(85);mylink.addNode(88);mylink.addNode(93);mylink.addNode(99);/*** 模擬鏈表 “查” 的操作,打印指定數據所在鏈表位置(索引)*/mylink.searchNode(88);mylink.searchNode(100);/*** 模擬鏈表 “增” 的操作,讓插入新結點到指定的鏈表位置(索引)*/mylink.insertNode(3,90);// 打印所有元素,驗證插入操作的結果mylink.printLink();} }linkdemo2.java:模擬刪除操作
package com.notes.data_structure;public class linkDemo02 {public static void main(String[] args) {MyLink mylink = new MyLink();mylink.addNode(95);mylink.addNode(85);mylink.addNode(88);mylink.addNode(93);mylink.addNode(99);/*** 模擬鏈表 “刪” 的操作,刪除指定索引位置的元素*/mylink.deleteNode(3);// 遍歷打印驗證刪除結果mylink.printLink();} }?
總結
以上是生活随笔為你收集整理的数据结构学习笔记(一):链表(linked list)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编写一个java打印心程序_java –
- 下一篇: 数据结构学习笔记(三):队列(queue