數據結構02-鏈表

說明:由于該數據結構是由java并且是原生實現,所以與C有一些出入,不過原理是相同的

1.鏈表的定義

    為了表示線性表元素a與a+1的邏輯關系,存儲數據時,除了存儲元素本身的信息之外,還存儲了直接后繼元素的位置信息。這兩部分組成的數據元素被稱為“結點”,一個結點分為兩部分,存放數據元素信息的部分被稱為數據域,

    存放直接后繼元素位置的部分被稱為指針域。

    單鏈表:結點指針域只存放直接后繼元素位置的鏈表,也叫單向鏈表。

    雙鏈表:結點指針域同時存放前驅元素和后繼元素位置的鏈表,也叫雙向鏈表。

    循環鏈表:一般的鏈表尾結點(最后一個結點)的指針域一般null,但是有的鏈表將最后一個節點的指針域指向頭結點,構成一個環,稱作循環鏈表。

    頭結點: 一個鏈表的頭節點,就是指針域指向該鏈表的第一個結點的結點,一般用來唯一確定一個鏈表(也有的鏈表是不帶頭結點的,那時我們通過鏈表的第一個結點來確定鏈表),注意:頭結點的數據與是null

2.實現原理

    鏈表的每一個結點包括兩部分,數據域和指針域,數據域用來存儲數據,指針域用來存儲后繼結點的位置。

 1 class Link<T>{
 2     /**
 3     *用來存儲數據
 4     */
 5     T data;
 6     /**
 7     *用來存儲下一結點位置
 8      */
 9     Link next;
10 }

3.鏈表的基本操作

    1.初始化 init() 創建一個鏈表

    2.清空 clear() 清空一個鏈表

    3.銷毀 destroy() 銷毀鏈表

    4.在頭部插入一個結點 insertFront()

    5.在尾部插入一個結點 insertBackend()

    6.在任意位置插入一個結點 insertIndex()

    7.刪除任意位置元素 delete()

    8.查找元素 find()

    9.獲取指定位置節點的值 get()

4.代碼實現

  4.1鏈表代碼實現

  1 package com.xiaobai.linelist;
  2 
  3 /**
  4  * @Author: xiaobai
  5  * @Date: 2019/5/1 9:00
  6  * @email:
  7  * @address:
  8  * @desc 模擬單鏈表操作
  9  * @Version 1.0
 10  */
 11 @SuppressWarnings("ALL")
 12 public final class Link<T> {
 13     /**
 14      * data 是要存儲的數據
 15      */
 16     private T data;
 17     /**
 18      * next是下一結點的引用位置
 19      */
 20     public Link<T> next;
 21 
 22     /**
 23      * 初始化操作 構造方法返回一個空結點
 24      */
 25     public Link(){
 26         this.next = null;
 27         this.data = null;
 28     }
 29 
 30     /**
 31      * 構造一個新的鏈表結點
 32      * 新結點是沒有后繼結點的 所以直接null
 33      * @param data 數據
 34      */
 35     public Link(T data){
 36         this.data = data;
 37         this.next = null;
 38     }
 39 
 40     /**
 41      * 清空鏈表操作
 42      * @param link 要被清空的鏈表頭節點
 43      */
 44     public void clear(){
 45         //讓每一個結點的引用都為 null GC 自動回收
 46         Link<T> link = this;
 47         while(link.next!=null){
 48             Link curr = link.next;
 49             link.next = link.next.next;
 50             curr = null;
 51         }
 52         link = null;
 53     }
 54 
 55     /**
 56      * 銷毀鏈表 這里的銷毀和清空我認為沒有什么區別,所以直接調用
 57      * 如果大家認為有區別的話,可以與我交流
 58      * @param link 被銷毀的鏈表
 59      */
 60     public void destroy(){
 61         this.clear();
 62     }
 63 
 64     /**
 65      * 在鏈表的頭部插入一個結點(默認是帶頭結點的鏈表)
 66      * @param head 鏈表的頭節點
 67      * @param data 被插入的數據
 68      * @return 插入結果
 69      */
 70     public boolean insertFront(T data){
 71         //先構建一個新的結點
 72         Link<T> node = new Link<T>(data);
 73         try {
 74             //將結點插入到頭部 即 新節點后繼指向原來的第一個結點  頭節點后繼指向新節點
 75             node.next = this.next;
 76             this.next = node;
 77             return true;
 78         }catch (Exception e){
 79             e.printStackTrace();
 80             return false;
 81         }
 82     }
 83 
 84     /**
 85      * 在鏈表的尾部插入一個結點
 86      * @param head 鏈表頭節點
 87      * @param data 要插入的數據
 88      * @return 插入結果
 89      */
 90     public boolean insertBackend(T data){
 91         //先構建一個新的結點
 92         try {
 93             Link<T> node = new Link<T>(data);
 94             //然后找到鏈表的尾
 95             Link<T> point = this.next;
 96             while(point.next!=null){
 97                 point = point.next;
 98             }
 99             //插入
100             point.next = node;
101             return true;
102         } catch (Exception e) {
103             e.printStackTrace();
104             return false;
105         }
106     }
107 
108     /**
109      * 在任意位置插入一個結點
110      * @param head 要插入的鏈表
111      * @param i  插入位置 從0開始
112      * @param data 插入的數據
113      * @return 插入結果
114      */
115     public boolean insertIndex(int i,T data){
116         Link curr = this.next;
117         //空鏈表 拒絕插入
118         if(null == curr && i > 0){
119             return false;
120         }
121         int count = 0;
122         //找到被插入的位置(要找被插入位置前一個)
123         while(count != i-1 && null != curr){
124             curr = curr.next;
125             count ++;
126         }
127         //如果循環提前結束 說明i值過大
128         if(count != i-1){
129             return false;
130         }
131         //開始插入節點
132         Link<T> node = new Link<T>(data);
133         node.next = curr.next;
134         curr.next = node;
135         return true;
136     }
137 
138     /**
139      * 刪除任意位置元素
140      * @param i 被刪除的位置  從0 開始
141      * @return 被刪除的元素 刪除失敗返回null
142      */
143     public T delete(int i){
144         T del = null;
145         int count = 0;
146         Link<T> curr = this.next;
147         //找到被刪除結點的前一個結點
148         while (curr != null&& count < i-1){
149             curr = curr.next;
150             count++;
151         }
152         //如果不滿足條件 刪除失敗
153         if(count!=i-1){
154             return del;
155         }
156         //如果找到 執行刪除操作 (GC 自動釋放)
157         del = curr.next.data;
158         curr.next = curr.next.next;
159         return del;
160     }
161 
162     /**
163      * 查找元素是否存在  可能需要重寫存儲對象的equals方法
164      * @param data 被查找元素
165      * @return 查找結果
166      */
167     public boolean find(T data){
168         Link curr = this.next;
169         while(curr != null){
170             if(curr.data.equals(data)||curr.data ==data){
171                 return true;
172             }
173             curr = curr.next;
174         }
175         return false;
176     }
177 
178     /**
179      * 獲取指定位置的元素
180      * @param i 位置
181      * @return 獲取到的值 沒有返回null
182      */
183     public T get(int i) {
184         T data = null;
185         Link<T> curr = this.next;
186         int count = 0;
187         while(count!=i && curr!=null){
188             curr = curr.next;
189             count ++;
190         }
191         if(count == i && curr!= null){
192             data = curr.data;
193         }
194         return data;
195     }
196 
197     @Override
198     public String toString() {
199         StringBuilder sb = new StringBuilder().append("HashCode = "+this.hashCode()).append(" {head -> ");
200         Link<T> curr = this.next;
201         while (curr!=null){
202             sb.append(curr.data+" -> ");
203             curr = curr.next;
204         }
205         sb.append(" null}");
206         return sb.toString();
207     }
208 }

?

  4.2? 測試代碼及結果

 1 /**
 2  * @Author: xiaobai
 3  * @Date: 2019/5/1 9:42
 4  * @email: 
 5  * @address:
 6  * @Version 1.0
 7  */
 8 public class TestLink {
 9     public static void main(String[] args) {
10         System.out.println("初始化鏈表");
11         Link<Integer> link = new Link<>();
12         System.out.println("當前鏈表: "+link);
13 
14         System.out.println("在前端插入一個元素 5");
15         link.insertFront(5);
16         System.out.println("當前鏈表: "+link);
17 
18         for(int i=1;i<=10;i++){
19             link.insertBackend(i);
20         }
21         System.out.println("依次從后端繼續插入10個數后: "+link);
22 
23         link.insertIndex(3,100);
24         //索引從0開始
25         System.out.println("在第三個位置上插入100以后的鏈表 "+link);
26 
27         System.out.println("在第100個位置上插入0 "+link.insertIndex(100,0));
28 
29         System.out.println("刪除第三個位置上的元素"+link.delete(3));
30         System.out.println(link);
31 
32         System.out.println("查找元素10的結果"+link.find(10));
33         System.out.println("查找元素100的結果"+link.find(100));
34 
35         System.out.println("獲取第3個結點的值 "+link.get(3));
36         System.out.println("獲取第999個結點的值 "+link.get(999));
37 
38         link.clear();
39         System.out.println("執行清空操作后的鏈表: "+link);
40 
41         link.destroy();
42 
43     }
44 }

      運行結果圖:

?

轉載于:https://www.cnblogs.com/xiaobai1202/p/10799114.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第四章 面向對象

第四章 面向對象 1. 基本格式 定義&#xff1a;當函數(業務功能)比較多&#xff0c;可以使用面向對象來進行歸類&#xff0c;如果有一個凡事使用的公共值&#xff0c;也可以放到對象中 #格式&關鍵字 class 類名:def __inti__(self,x)self.x xdef 方法名(self,name):print(…

洛谷P2347 砝碼稱重 某一年noip提高組原題

可以轉化為01背包求方案數的問題&#xff0c;dp數組f[][]表示第幾個砝碼能稱出的重量,可壓縮至一維 轉移方程為f(i,j)f(i-1,j-w[i]) 當前我們可以稱出的重量必定是由之前的砝碼重量轉移過來的 #include<bits/stdc.h> using namespace std; const int N550; const int max…

解決:-bash: unzip: command not found (Linux 中 unZip/Zip 的安裝及使用)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux系統沒有自帶的壓縮解壓工具&#xff1b;需要我們自己安裝&#xff1b; 當用到zip或者unzip如果沒有安裝就會出現 unzip: Command…

云計算時代IT專業人員需具備的10項技能

摘要&#xff1a;IT專業人員需要不斷的學習&#xff0c;才能確保自己的工作能力跟上時代的步伐。云時代IT專業人員不僅需要具備一定的專業技能&#xff0c;比如快速運用自身知識快速在互聯網上構建應用程序&#xff0c;還必須具備商業、金融、業務需求分析等等。 【編者按】談…

java自定義注解學習筆記

注解學習筆記之自定義注解 Target&#xff08;{1,2,3,4,5,6,7}&#xff09; 1.ElementType.CONSTRUCTOR:用于描述構造器2.ElementType.FIELD:用于描述域3.ElementType.LOCAL_VARIABLE:用于描述局部變量4.ElementType.METHOD:用于描述方法5.ElementType.PACKAGE:用于描述包6.Ele…

[xsy3132]數表

題意&#xff1a;一個$n\times m$的數表&#xff0c;數值$\in[0,4)$&#xff0c;你可以任意次選擇一行或一列$1,\text{mod }4$&#xff0c;要最小化所有數的和 因為$n\leq10$&#xff0c;所以數表可以看成$m$個$n$位$4$進制數$a_{1\cdots m}$&#xff0c;以下使用不進位加法 定…

linux 下載、安裝 maven

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 創建maven的文件夾并下載maven的tar包到此文件夾中 //進入一個目錄 cd /usr/local//創建一個文件夾 mkdir maven//下載maven的tar包…

ELK4之進階學習

1.精確查找和模糊查找(term和match的區別) match經過分析(analyer)的, term是不經過分詞,直接去倒排索引中查找精確的值. 2.建議器的簡介(最左前綴或者自帶的做) (1)直接用現成的 (2)不只是糾錯,還有建議等等. (3)優點:用戶體驗,服務器減少請求(減少壓力,太耗電了,熱量太大) (4…

女人必知 教你認清6種隱性壞男人

周圍不乏有女朋友喜歡歷數往事、追憶曾擦肩而過的男人&#xff0c;有的說如果不是自己太苛求提早要見他家人引起反感&#xff0c;早就和心愛的人儷影雙雙甜蜜快樂了&#xff0c;還有的說暗戀的男生那一夜向他表露情感、她萬分感動、可男生最后提出上床她拒絕了、因而錯失了一段…

c# 編程學習(二)

2019獨角獸企業重金招聘Python工程師標準>>> 標識符是對程序中的各個元素進行標識的名稱。 ? 只能使用字母(大寫和小寫)、數字和下劃線 ? 標識符必須以字母或下劃線開頭 變量是容納值的存儲位置。可將變量想象成容納臨時信息的容器 命名變量的建議&#xff1a; …

linux 中的 nohup 命令(設置后臺進程): nohup: ignoring input and appending output to ‘nohup.out’

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Linux 下使用 nohup Unix/Linux下一般比如想讓某個程序在后臺運行&#xff0c;很多都是使用 & 在程序結尾來讓程序自動運行。 …

PowerDesigner表結構和字段大小寫轉換

原文&#xff1a;https://www.cnblogs.com/zhzhang/p/3946609.html 【轉】PowerDesigner表結構和字段大小寫轉換 【轉自】http://blog.csdn.net/xysh1991/article/details/8016192 使用方法&#xff1a;進入PowerDesigner&#xff0c;打開一個PDM&#xff0c;在菜單欄找到&…

解決:Could not find or load main class org.apache.rocketmq.example.quickstart.Producer

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.情景描述 &#xff1a;我只是想安裝運行 rocketmq&#xff0c;執行命令&#xff1a; sh bin/tools.sh org.apache.rocketmq.example.…

深入理解C++ 虛函數表

目錄 深入理解C 虛函數表虛函數表概述單繼承下的虛函數表派生類未覆蓋基類虛函數派生類覆蓋基類虛函數多繼承下的虛函數表無虛函數覆蓋派生類覆蓋基類虛函數鉆石型虛繼承總結幾個原則安全性問題深入理解C 虛函數表 ? C中的虛函數的作用主要是實現了多態的機制。關于多態&#…

react-native-baidu-map使用及注意問題

使用組件&#xff1a; react-native-baidu-map 獲取百度地圖API_KEY 地址&#xff1a;lbsyun.baidu.com&#xff0c;在控制臺成功創建應用后&#xff0c;就可以看到應用的api key了 安裝 yarn add react-native-baidu-map 復制代碼原生部分 Android配置 react-native link reac…

簡單掃清身體垃圾

“我們的身體在被‘設計’之初&#xff0c;就擁有了自主掃除體內垃圾的功能。只不過&#xff0c;這需要我們按照正確的方法去激發它 。”美國暢銷書作者喬斯卡曼和朱莉佩萊斯&#xff0c;在她們去年合著的《自我清潔》一書中強調了養成良好生活習慣可為身體排毒的重要性。 近日…

linux (阿里云 CentOS7) 中安裝配置 RocketMQ

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 JDK1.8的安裝&#xff1a; 1.檢查系統的JDK版本 根目錄下操作&#xff1a;cd java -version 2.檢測JDK安裝包 rpm -qa | grep ja…

Bootstrap簡介

1.使用準備 1.1 Bootstrap的下載 http://www.bootcss.com&#xff0c;下載用于生產環境的Bootstrap即可。 1.2 Bootstrap包含的內容 ● 全局CSS&#xff1a;基本的 HTML 元素均可以通過 class 設置樣式并得到增強效果&#xff1b;還有先進的柵格系統。 ● 組件&#xff1a;無數…

用TortoiseGit時的實用git命令

生成并獲取 sshkey&#xff1a; ssh-keygen -t rsa -C "xxxxxxxxxx.com" cat ~/.ssh/id_rsa.pub 克隆倉庫&#xff1a; git clone xxxxxx/xxx.git 重命名文件&#xff1a; mv file_name new_file_name git目錄區分大小寫&#xff1a; git config core.ignorecase fal…

有一種失敗叫瞎忙

很多時候&#xff0c;我們都在不知不覺的瞎忙&#xff0c;為了避免這樣的瞎忙&#xff0c;特為大家分享一個小的故事。 在一個山谷的禪房里有一位老禪師&#xff0c;他發現自己有一個徒弟非常勤奮&#xff0c;不管是去化緣&#xff0c;還是去廚房洗菜&#xff0c;這個徒弟從…