java實(shí)現(xiàn)線性表及其算法
線性表
線性表是最簡(jiǎn)單和最常用的一種數(shù)據(jù)結(jié)構(gòu),它是有n個(gè)體數(shù)據(jù)元素(節(jié)點(diǎn))組成的有限序列。其中,數(shù)據(jù)元素的個(gè)數(shù)n為表的長(zhǎng)度,當(dāng)n為零時(shí)成為空表,非空的線性表通常記為:
(a1,a2,… ,ai-1,ai, ai+1,…,an)
一. 線性表的順序存儲(chǔ)及算法
線性表的順序存儲(chǔ)指的是將線性表的數(shù)據(jù)元素按其邏輯次序依次存入一組地址連續(xù)的存儲(chǔ)單元里,用這種方法存儲(chǔ)的線性表稱為順序表。
1.順序表的結(jié)構(gòu)定義
public class SeqList {
/* 初始空間為10 */
private static final int LIST_SIZE = 10;
/* 數(shù)組data用來存放元素 */
private int[] data;
/* 當(dāng)前表長(zhǎng),實(shí)際存儲(chǔ)元素的個(gè)數(shù) */
private int length;
}
2.插入運(yùn)算
順序表的插入運(yùn)算是指在線性表的第i-1個(gè)元素和第i個(gè)元素之間插入一個(gè)新元素。由于順序表邏輯上相鄰的元素在物理結(jié)構(gòu)上也相鄰,其物理存儲(chǔ)關(guān)系也要發(fā)生相應(yīng)的變化。除非i=n+1,否則必須將原順序表的第i個(gè)元素開始的所有元素分別向后移動(dòng)1個(gè)位置。
/**
* 在順序表list中第i個(gè)位置之前插入一個(gè)新元素node
* @param list 順序表
* @param i 插入位置
* @param node 新元素
*/
public void insertList(SeqList list, int i, int node) {
if (i < 1 || i > list.length + 1) {
System.out.println("position error");
return;
}
if (list.length >= LIST_SIZE) {
System.out.println("overflow");
return;
}
for (int j = list.length - 1; j >= i - 1; j --) {
/* 從最后一個(gè)元素開始逐一后移 */
list.data[j+1] = list.data[j];
}
/* 插入新元素 */
list.data[i-1] = node;
/* 表長(zhǎng)加1 */
list.length ++;
}
3.刪除運(yùn)算
順序表的刪除運(yùn)算指的是將表中第i個(gè)元素刪除,與插入運(yùn)算相反,插入是向后移動(dòng)元素,刪除運(yùn)算則是向前移動(dòng)元素。
/**
* 在順序表list中刪除第i個(gè)元素,并返回被刪除的元素
* @param list 順序表
* @param i 元素位置
* @return node
*/
public int deleteList(SeqList list, int i) {
int node = 0;
if (i < 0 || i > list.length) {
System.out.println("position error");
return node;
}
node = list.data[i-1];
for (int j = i; j < list.length; j ++) {
/* 元素前移 */
list.data[j-1] = list.data[j];
}
list.length --;
return node;
}
4.順序表逆置
先以表長(zhǎng)的一半為循環(huán)控制次數(shù),將表中最后一個(gè)元素同順序順數(shù)第一個(gè)元素交換,將倒數(shù)第二個(gè)元素同順數(shù)第二個(gè)元素交換,以此類推,直至交換完為止。
/**
* 順序表逆置
* @param list 原始順序表
* @return 逆置后的順序表
*/
public SeqList converts(SeqList list) {
int node;
int length = list.length/2;
for (int i = 0; i < length; i ++) {
/* 對(duì)稱交換元素 */
int j = list.length - 1 - i;
node = list.data[i];
list.data[i] = list.data[j];
list.data[j] = node;
}
return list;
}
二. 線性表的鏈?zhǔn)酱鎯?chǔ)及算法
鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)存儲(chǔ)線性表數(shù)據(jù)元素的存儲(chǔ)空間可能是連續(xù)的,也可能是不連續(xù)的,因而鏈表的節(jié)點(diǎn)是不可以隨機(jī)存取的,鏈?zhǔn)酱娲质亲畛R姷拇鎯?chǔ)方式之一。
在使用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示每個(gè)數(shù)據(jù)元素時(shí),除了存儲(chǔ)元素本身的信息外,還需要一個(gè)存儲(chǔ)指示后繼元素存儲(chǔ)位置的地址,利用這種存儲(chǔ)方式表示的線性表稱為鏈表。
5.單鏈表的結(jié)構(gòu)定義
public class LinkList {
/* 數(shù)據(jù)域 */
private char data;
/* 后繼元素 */
private LinkList next;
}
6.頭插法建表算法
頭插法是從一個(gè)空表開始,重復(fù)讀入數(shù)據(jù),生成新節(jié)點(diǎn),將讀入的數(shù)據(jù)存放到新節(jié)點(diǎn)的數(shù)據(jù)域中,然后將新節(jié)點(diǎn)插入到當(dāng)前鏈表的表頭上,直到結(jié)束為止。
/**
* 頭插法創(chuàng)建表
* @param chars 字符數(shù)組
* @return 單鏈表
*/
public LinkList createListF(char[] chars) {
LinkList node;
LinkList head = null;
for (char ch : chars) {
/* 申請(qǐng)新節(jié)點(diǎn) */
node = new LinkList();
node.data = ch;
/* 指向后繼節(jié)點(diǎn) */
node.next = head;
head = node;
}
/* 返回頭節(jié)點(diǎn) */
return head;
}
7.尾插法建表算法
頭插法建表中節(jié)點(diǎn)的次序和輸入時(shí)的順序相反,若需要和輸入次序一致,則可使用尾插法。
/**
* 尾插法建表
* @param chars 字符數(shù)組
* @return 單鏈表
*/
public LinkList createListR(char[] chars) {
LinkList node;
LinkList head = null;
LinkList rear = null;
for (char ch : chars) {
node = new LinkList();
node.data = ch;
if (head == null) {
/* 新節(jié)點(diǎn)為頭節(jié)點(diǎn) */
head = node;
} else {
/* 上一個(gè)節(jié)點(diǎn)指向新節(jié)點(diǎn) */
rear.next = node;
}
/* 表尾指向新的節(jié)點(diǎn) */
rear = node;
}
/* 返回頭節(jié)點(diǎn) */
return head;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ)
- java 線性表接口的實(shí)例詳解
- java線性表的存儲(chǔ)結(jié)構(gòu)及其代碼實(shí)現(xiàn)
- Java數(shù)據(jù)結(jié)構(gòu)順序表從零基礎(chǔ)到精通進(jìn)階
- Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作
- Java實(shí)現(xiàn)順序表和鏈表結(jié)構(gòu)
- Java實(shí)現(xiàn)順序表的操作
- Java數(shù)據(jù)結(jié)構(gòu)之順序表篇
- Java中ArrayList與順序表的概念與使用實(shí)例
- Java線性表的順序表示及實(shí)現(xiàn)
相關(guān)文章
spring-boot-starter-web更換默認(rèn)Tomcat容器的方法
Spring Boot支持容器的自動(dòng)配置,默認(rèn)是Tomcat,當(dāng)然我們也是可以進(jìn)行修改的。下面小編給大家?guī)砹藄pring-boot-starter-web更換默認(rèn)Tomcat容器的方法,感興趣的朋友跟隨小編一起看看吧2019-04-04
restTemplate實(shí)現(xiàn)跨服務(wù)API調(diào)用方式
這篇文章主要介紹了restTemplate實(shí)現(xiàn)跨服務(wù)API調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-07-07
redis防止重復(fù)提交的實(shí)現(xiàn)示例
在開發(fā)中我們都需要處理重復(fù)提交的問題,本文主要介紹了redis防止重復(fù)提交的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
解讀Java和JavaScript區(qū)別與聯(lián)系
這篇文章主要介紹了解讀Java和JavaScript區(qū)別與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解
這篇文章主要介紹了Java編程實(shí)現(xiàn)非對(duì)稱加密的方法,簡(jiǎn)單講述了非對(duì)稱加密的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)DH加密解密、RSA加密解密、ElGamal加密等具體操作技巧,需要的朋友可以參考下2017-08-08
Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
MyBatis如何進(jìn)行雙重foreach循環(huán)
這篇文章主要介紹了MyBatis如何進(jìn)行雙重foreach循環(huán),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

