日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构学习笔记(一):链表(linked list)

發布時間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构学习笔记(一):链表(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。