數據結構:順序表+鏈表

數據結構:順序表+鏈表

一。順序表:

首先在了解順序表和鏈表之前,先了解一下線性表,**線性表(linear list)**是n個具有相同特征元素的有限序列 ,在邏輯上是線性結構,也就是一條連續的直線,但是在物理上不一定是連續的。常見的線性表:順序表,鏈表,棧,隊列…

順序表是用一段物理地址連續的存儲單元一次儲存數據元素的線性結構,一般情況下使用數組存儲。在數組上完成數據的增刪查改

下面將了解順序表的底層實現邏輯:

接口:

public interface SeqList {public void add(int data);//新增元素,默認在數組最后進行新增public void add(int pos,int data);//新增元素,在pos這個位置加上data這個數據public boolean contain(int toFind);//查看toFind這個元素是否在數組中存在public int index(int toFind);//查看這個元素在數組中的下標public int get(int pos);//獲取pos位置的元素public void set(int pos,int value);//給pos位置的值修改為valuepublic int remove(int toRemove);//刪除第一次出現的的關鍵字keypublic int size();//獲取順序表的長度public void display();//打印順序表
}

接口的實現:

import java.util.Arrays;public class Main implements SeqList{private int[] elem=new int[10];private int usedSize;@Overridepublic void add(int data) {if(isFull()){elem= Arrays.copyOf(elem,elem.length*2);}this.elem[usedSize]=data;usedSize++;}public boolean isFull(){if(usedSize==elem.length){return true;}return false;}@Overridepublic void add(int pos, int data) {if(pos<0 || pos>usedSize){System.out.println("輸入不合法");//可以把這個寫進一個方法中,然后寫一個異常,如果pos不合法就拋出異常}if(isFull()){elem=Arrays.copyOf(elem,elem.length*2);}for(int i=usedSize-1;i >=pos;i--){//先把所有的元素向后移動一個單元,當i<pos的時候就結束elem[i+1]=elem[i];}elem[pos]=data;usedSize++;}@Overridepublic boolean contain(int toFind) {for(int i=0;i<usedSize;i++){if(elem[i]==toFind){return true;}}return false;}@Overridepublic int index(int toFind) {if(this.contain(toFind)){for(int i=0;i<usedSize;i++){if(elem[i] == toFind){return i;}}}return 0;}@Overridepublic int get(int pos) {if(pos<0||pos>usedSize-1){System.out.println("輸入的元素不合法");}else {for (int i=0;i<usedSize;i++){if(pos==i){//System.out.println(elem[pos]);return elem[pos];}}}return 0;}@Overridepublic void set(int pos, int value) {if(pos<0||pos>usedSize){System.out.println("輸入不合法");}elem[pos]=value;}@Overridepublic void remove(int toRemove) {int ret=this.index(toRemove);//獲取刪除元素的下標for(int i=ret;i<usedSize-1;i++){elem[i]=elem[i+1];}elem[usedSize-1]=0;usedSize--;}@Overridepublic int size() {int count=0;for(int i=0;i<elem.length;i++){count++;}return count;}@Overridepublic void display() {for(int i=0;i<usedSize;i++){System.out.println(elem[i]+" ");}}
}

二。ArrayList的使用

ArrayList是以泛型方式實現的,使用時必須先要將其實例化

1.ArrayList的構造:

List<Integer> list1=new ArrayList<>();//構造一個空的列表
List<Integer> list1=new ArrayList<>(10);//構造一個列表,其中含有10個元素

2.ArrayList的常見操作;

import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<Integer> list1=new ArrayList<>();list1.add(10);//加入元素list1.add(0,10)//在0下標的位置插入數字10list1.remove(1);//刪除下標為1的值list1.get(2);//獲取下標為2的值list1.set(1,3);//把下標為1的位置的值改為3list1.contain(12);//是否有12這個值在此線性表中list1.indexOf(10);//返回第一個值為10的下標list1.size();//獲取整個順序表的元素個數  }
}

注意:

當實例一個空的列表時,第一次add默認分配一個大小為10的內存(在實例化階段不分配內存)

擴容是自動以1.5倍的形式擴容

3.順序表的遍歷

//法一:
for(int i=0;i<list.size();i++){System.out.println(list.get(i));
}
//法二:
System.out.println(list);

三。ArrayList的具體使用例子

楊輝三角的實現:

在這里插入圖片描述

上述這個圖片就是我們常說的楊輝三角,在高中的時候沒少接觸這個東西

這個楊輝三角主要的實現方式是通過二維順序表實現的,下面將對用二維順序表來實現楊輝三角的實現

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Soulation {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("請輸入");int input=sc.nextInt();List<List<Integer>> list=new ArrayList<>();//第一行的導入List<Integer> arr=new ArrayList<>();arr.add(1);list.add(arr);//從第二行開始,進行計算、for(int i=1;i<input;i++){List<Integer> curRow=new ArrayList<>();curRow.add(1);List<Integer> prevRow=list.get(i-1);for(int j=1;j<i;j++){int val=prevRow.get(j)+prevRow.get(j-1);}curRow.add(1);list.add(curRow);}}
}

四。鏈表:

在介紹鏈表之前,先說一下ArrayList的缺點;當在ArrayList任意位置進行刪除元素或者增加元素的時候,就需要將所有元素進行前移或者后移,這樣時間復雜度就是O(n),效率非常低,因此涉及到數據的大量插入和刪除的操作就不太適合ArrayList了,因此引入了鏈表來解決這個問題

鏈表是一種物理存儲上非連續的存儲結構,數據元素的邏輯順序是通過鏈表中的引用鏈接的次序進行實現的(物理上是不連續的,但是邏輯上是連續的)

圖示:

五。無頭單向鏈表的實現

接口:

public interface SingleLinkedList {public void add(int data);//頭插法public void addLast(int data);//尾插法public void addIndex(int index,int data);//把data插入到index位置public boolean contains(int key);//鏈表中是否存在數據keypublic void remove(int key);//刪除第一次出現key數據的節點public void display();//展示鏈表中所有的元素
}

接口的實現:

public class SingleList implements SingleLinkedList{static class ListNode{public int val;public ListNode next;public ListNode(int val){this.val=val;}}public ListNode head;@Overridepublic void add(int data) {ListNode node=new ListNode(data);if(this.head==null){head=node;}else {node.next=head;head=node;}}@Overridepublic void addLast(int data) {ListNode node=new ListNode(data);ListNode cur=head;if(head==null){head=node;}else{while(cur.next!=null){cur=cur.next;}cur.next=node;}}@Overridepublic void addIndex(int index, int data) {ListNode node=new ListNode(data);int count=0;ListNode cur=head;if(head==null){head=node;}else{while(cur.next!=null){if(count==index-1){ListNode hi=cur.next;cur.next=node;node.next=hi;break;}count++;}}}@Overridepublic boolean contains(int key) {ListNode cur=head;if(head==null){return false;}else{while(cur.next!=null){if(cur.val==key){return true;}cur=cur.next;}}return false;}@Overridepublic void remove(int key) {ListNode cur=head;ListNode last=head;if(head.val==key){head=head.next;}//當要刪除的值是鏈表的第一位的時候while(cur.next!=null){cur=cur.next;if(cur.val==key){last.next=cur.next;}last=last.next;}}@Overridepublic void display() {ListNode cur=head;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}}
}

主函數:

public class Main {public static void main(String[] args) {SingleList singleList=new SingleList();singleList.addLast(12);singleList.addLast(23);singleList.addLast(34);singleList.addLast(45);singleList.addIndex(1,2);singleList.display();System.out.println(singleList.contains(2));singleList.remove(23);singleList.display();}
}

以上就是單鏈表的增刪查所有的代碼,大家可以嘗試自己寫一遍

六。LinkedList的使用

1.LinkedList介紹:

LinkedList本質上是一個雙向鏈表,由于鏈表沒有將元素存儲在連續的空間之中,元素存儲在單獨的節點之中,然后通過引用節點將節點連接起來了,因此在插入或刪除元素的時候,不需要搬移元素,效率較高

2.LinkedList的構造:

List<Integer> list1=new LinkedList<>();

3.LinkedList的其他方法的介紹:

list1.add(45);//尾插45
list1.add(3,10);//在3這個位置插入10這個數字
list1.remove(2);//刪除2位置這個元素
list1.get(2);//獲取下標為2的元素的值
list1.set(2,199);//把下標為2的位置的值改為199
list1.contains(199);//查看此鏈表中是否含有199這個數字
list1.indexOf(199);//返回這個鏈表中第一次出現199這個元素的下標

4.LinkedList的遍歷:

法一:

System.out.println(list);

法二:

for(int i=0;i<list.size;i++){System.out.println(list.get(i));
}

七。ArrayList與LinkedList的區別

不同點ArrayListLinkedList
存儲空間上物理上連續邏輯上連續,但是物理上不一定連續
隨機訪問支持不支持
頭插需要搬移元素,效率低,O(n)只用修改引用的指向,空間復雜讀:O(1)
插入空間不夠時可以進行擴容沒有容量大概念
應用場景元素高效存儲+頻繁訪問任意位置刪除添加頻繁

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

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

相關文章

自動化升級:Conda包依賴的智能更新策略

自動化升級&#xff1a;Conda包依賴的智能更新策略 引言 在科學研究和軟件開發中&#xff0c;依賴管理是確保項目順利進行的關鍵環節。Conda作為流行的包管理器&#xff0c;提供了強大的依賴更新功能&#xff0c;幫助用戶自動化和簡化依賴項的更新過程。本文將深入探討如何在…

WPF依賴附加屬性

依賴附加屬性的定義 基本過程&#xff1a;聲明、注冊、包裝 依賴附加屬性必須在依賴對象&#xff0c;附加屬性不一定&#xff0c;關注的是被附加的對象是否是依賴對象 快捷方式&#xff1a;propa tab 關鍵字&#xff1a;RegisterAttached // 方法封裝 public static int …

Unity3d C#實現基于UGUI ScrollRect的輪播圖效果功能(含源碼)

前言 輪播功能是一種常見的頁面組件&#xff0c;用于在頁面中顯示多張圖片/素材并自動或手動進行切換&#xff0c;以提高頁面的美觀度和用戶體驗。主要的功能是&#xff1a;自動/手動切換;平滑的切換效果;導航指示器等。可惜Unity的UGUI系統里沒有現成的實現該功能&#xff0c…

第五次作業(多表聯合查詢)

新增員工表emp和部門表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,財務), (102,銷售…

Shell學習——Shell echo命令

文章目錄 echo命令 echo命令 1.顯示普通字符串: echo "It is a test"這里的雙引號完全可以省略&#xff0c;以下命令與上面實例效果一致&#xff1a; echo It is a test2.顯示轉義字符 echo "\"It is a test\""結果將是: "It is a tes…

掌握MOJO命令行:參數解析的藝術

在軟件開發中&#xff0c;命令行接口&#xff08;CLI&#xff09;是一種與程序交互的強大方式&#xff0c;它允許用戶通過終端輸入指令和參數來控制程序的行為。對于MOJO語言&#xff0c;即使它是一個假想的編程語言&#xff0c;我們也可以設想它具備解析命令行參數的能力。本文…

初識C++【命名空間】【輸入輸出】【缺省參數】【函數重載】

前言 C是一種通用的編程語言&#xff0c;被廣泛用于開發各種應用程序&#xff0c;包括系統軟件、游戲、手機應用和高性能計算等。它是C語言的擴展&#xff0c;添加了許多新特性和功能&#xff0c;并支持面向對象編程。C可以在不同的平臺上編譯和運行&#xff0c;具有高效性、可…

開放式耳機哪個品牌比較好?2024最值得推薦的火爆機型!!

在這個快節奏的時代&#xff0c;我們都在尋找那些既能讓我們享受音樂&#xff0c;又能保持對外界感知的音頻設備。開放式耳機以其獨特的設計&#xff0c;滿足了這一需求&#xff0c;它們讓你在享受音樂的同時&#xff0c;還能聽到周圍環境的聲音&#xff0c;無論是安全出行還是…

華為、H3C、銳捷、思科四大設備廠商交換機配置命令總結合輯

號主&#xff1a;老楊丨11年資深網絡工程師&#xff0c;更多網工提升干貨&#xff0c;請關注公眾號&#xff1a;網絡工程師俱樂部 下午好&#xff0c;我的網工朋友。 一直以來&#xff0c;對于華為、H3C、銳捷、思科交換機的命令配置&#xff0c;不斷的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新聞聚焦

隨著夏日的炎炎熱浪逐漸升溫&#xff0c;七月的校園生活也如火如荼地展開。在這個充滿活力的季節里&#xff0c;各大高校不僅迎來了學術交流的高峰&#xff0c;也在科技創新、國際合作等方面取得了顯著成就。以下是本月內幾所知名高校的重要新聞動態&#xff0c;它們不僅展現了…

數據庫 視圖

-- 刪除舊的視圖&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 創建新的視圖 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事項 如果視圖不滿足更新條件&#xff08;如包含JOIN、…

譜瑞科技高速傳輸接口芯片選型應用

譜瑞科技股份有限公司為一專供多種普及顯示器以及個人計算機、消費性電子產品與顯示面板所使用之高速訊號傳輸接口標準之混和信號 IC 芯片之領導供貨商。譜瑞公司成立于 2005 年為一無自有晶圓廠之半導體公司&#xff0c;并于 2011 年股票在臺灣柜臺買賣中心正式掛牌交易(股票代…

深入淺出:Scikit-Learn基礎教程

引言 Scikit-Learn&#xff08;簡稱sklearn&#xff09;是Python中一個強大的機器學習庫&#xff0c;提供了豐富的工具和模塊&#xff0c;幫助我們輕松實現數據預處理、模型訓練、評估和預測。本文將通過一個簡單的教程&#xff0c;帶您快速入門Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事務和兩階段提交協議】

1、事務實現原理和 WAL&#xff08;單機&#xff09; 屬性含義數據庫系統實現Atomic&#xff08;原子性&#xff09;事務中的操作要么全部正確執行&#xff0c;要么完全不執行&#xff08;要么成功、要么失敗&#xff09;Write Ahead Logging 預寫日志&#xff0c;分布式事務&…

C語言希爾排序詳解與實例

希爾排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一種排序算法。它是插入排序的一種高效改進版&#xff0c;通過引入“增量”概念&#xff0c;將原本的線性查找轉換為分段查找&#xff0c;從而顯著提升了排序效率。本文將深入探討希爾排…

SRC漏洞挖掘技巧:修改返回包的各種姿勢

聽說大家都在要星標&#xff0c;我也要一個吧&#xff0c;可以把我的公眾號打上小星星嗎&#xff1f;~ 又雙叕周一了&#xff0c;還是老樣子&#xff0c;來篇技術向的給大家提提神吧~ 如果你對漏洞挖掘或技術向不感興趣&#xff0c;那么到這就可以了&#xff0c;不用再繼續往下…

【刪庫跑路】一次刪除pip下載的所有第三方庫方法

進入命令行&#xff0c;先list看下庫存 pip list導出所有的第三方庫至一文件列表 pip freeze >requirements.txt按照列表卸載所有庫 pip uninstall -r requirements.txt -y再list看下&#xff0c;可見庫存已清空

1、課程導學(react+區塊鏈實戰)

1、課程導學&#xff08;react區塊鏈實戰&#xff09; 1&#xff0c;課程概述&#xff08;1&#xff09;課程安排&#xff08;2&#xff09;學習前提&#xff08;3&#xff09;講授方式&#xff08;4&#xff09;課程收獲 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符緩沖流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;寫一行行分隔符&#xff0c;行分隔符字符串由系統屬性定義 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;讀一行文字&#xff0c;結果包含行的內容的字…

振動分析-11-軸承數據庫之深度學習一維故障分類Transformer

Pytorch-Transformer軸承故障一維信號分類(三) 1 制作數據集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)