Java鏈表中添加元素的原理與實現(xiàn)方法詳解
本文實例講述了Java鏈表中添加元素的原理與實現(xiàn)方法。分享給大家供大家參考,具體如下:
1.鏈表中頭節(jié)點的引入
1.1基本的鏈表結(jié)構(gòu):

1.2對于鏈表來說,若想訪問鏈表中每個節(jié)點則需要把鏈表的頭存起來,假如鏈表的頭節(jié)點為head,指向鏈表中第一個節(jié)點,如圖:

1.3使用代碼表示此時的鏈表
//定義頭節(jié)點
private Node head;
//節(jié)點個數(shù)
private int size;
//無參數(shù)構(gòu)造函數(shù)
public LinkedList() {
head = null;
size = 0;
}
//獲取鏈表中的元素個數(shù)
public int getSize() {
return size;
}
//返回鏈表是否為空
public boolean isEmpty() {
return size == 0;
}
2.在鏈表頭添加元素
2.1初始時,假設鏈表如下:

2.2 如在鏈表頭添加一個666元素則需要先將666放進一個節(jié)點里,在節(jié)點里存入這個元素以及相應的next。

操作如下:
第一步:現(xiàn)將666這個節(jié)點(node)的next指向head,代碼如下:
node.next=head
圖示為:

第二步:然后再將head指向新的節(jié)點666
head=node
圖示為:

通過第一步、第二步,我們就成功將新節(jié)點添加到頭節(jié)上。此時node這個變量也就結(jié)束了此輪的工作,結(jié)果變?yōu)椋?/p>

2.3 在鏈表頭添加新元素的相關(guān)代碼
//在鏈表頭添加新的元素e
public void addFirst(E e) {
Node node = new Node(e);
node.next = head;
head = node;
size++;
}
等同于:
//在鏈表頭添加新的元素e
public void addFirst(E e) {
head = new Node(e, head);
size++;
}
2.4 在鏈表中間添加元素
假設初始鏈表為:

假設我們需要在索引為2的位置添加元素666(此時的索引為2只是用來說明我們此時需要操作的位置,并不是真正的索引意思)
操作步驟:
1):創(chuàng)建出666這個節(jié)點

2):使用一個變量prev來標識在需要插入節(jié)點的地方的前一個節(jié)點,初始時prev和頭節(jié)點head是相同的。

對于此處我們需要在索引為2的位置插入新元素,我們只需要找到索引為2的前一個位置(索引為1),然后把prev指向索引為1節(jié)點即可。

3):進行元素添加操作
第一步:先將node的next指向prev的下一個節(jié)點元素
node.next=prev.next

第二步:再將prev的next指向node
prev.next=node

通過第一步、第二步即可將新元素插入到索引為2的地方。
從上不難看出,對于在鏈表中添加元素關(guān)鍵是找到要添加的節(jié)點的前一個節(jié)點,因此對于在索引為0的節(jié)點添加元素就需要單獨處理。
關(guān)于在鏈表中間添加元素的代碼:
//在鏈表的index(0--based)的位置添加新的元素e (實際不常用,練習用)
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("位置不合法");
}
//對于頭節(jié)點的特殊處理
if (index == 0) {
addFirst(e);
} else {
Node prev = head;
for (int i = 0; i < index - 1; i++) {//獲取到需要添加元素位置的前一個元素
prev = prev.next;
}
Node node = new Node(e);
node.next = prev.next;
prev.next = node;
size++;
}
}
此時代碼等同于:
//在鏈表的index(0--based)的位置添加新的元素e (時間不常用,練習用)
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("位置不合法");
}
//對于頭節(jié)點的特殊處理
if (index == 0) {
addFirst(e);
} else {
Node prev = head;
for (int i = 0; i < index - 1; i++) {//獲取到需要添加元素位置的前一個元素
prev = prev.next;
}
// Node node = new Node(e);
// node.next = prev.next;
// prev.next = node;
prev.next=new Node(e,prev.next);
size++;
}
}
3.在鏈表尾部添加元素
這里復用上述的add()方法
//在鏈表末尾添加新的元素
public void addLast(E e){
add(size,e);
}
本小節(jié)完整代碼:
package LinkedList;
public class LinkedList<E> {
//將Node節(jié)點設計成私有的類中類
private class Node<E> {
public E e;
public Node next;
//兩個參數(shù)的構(gòu)造函數(shù)
public Node(E e, Node next) {
this.e = e;
this.next = next;
}
//一個參數(shù)的構(gòu)造函數(shù)
public Node(E e) {
this.e = e;
this.next = null;
}
//無參構(gòu)造函數(shù)
public Node() {
this(null, null);
}
@Override
public String toString() {
return e.toString();
}
}
//定義頭節(jié)點
private Node head;
//節(jié)點個數(shù)
private int size;
//無參數(shù)構(gòu)造函數(shù)
public LinkedList() {
head = null;
size = 0;
}
//獲取鏈表中的元素個數(shù)
public int getSize() {
return size;
}
//返回鏈表是否為空
public boolean isEmpty() {
return size == 0;
}
//在鏈表頭添加新的元素e
public void addFirst(E e) {
head = new Node(e, head);
size++;
}
//在鏈表的index(0--based)的位置添加新的元素e (實際不常用,練習用)
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("位置不合法");
}
//對于頭節(jié)點的特殊處理
if (index == 0) {
addFirst(e);
} else {
Node prev = head;
for (int i = 0; i < index - 1; i++) {//獲取到需要添加元素位置的前一個元素
prev = prev.next;
}
// Node node = new Node(e);
// node.next = prev.next;
// prev.next = node;
prev.next=new Node(e,prev.next);
size++;
}
}
//在鏈表末尾添加新的元素
public void addLast(E e){
add(size,e);
}
}
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關(guān)文章
關(guān)于logback.xml和logback-spring.xml的區(qū)別及說明
這篇文章主要介紹了關(guān)于logback.xml和logback-spring.xml的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
java使用apache commons連接ftp修改ftp文件名失敗原因
這篇文章主要介紹了java使用apache commons連接ftp修改ftp文件名失敗原因解析,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
SpringCloud實現(xiàn)基于RabbitMQ消息隊列的詳細步驟
在Spring Cloud框架中,我們可以利用RabbitMQ實現(xiàn)強大而可靠的消息隊列系統(tǒng),本篇將詳細介紹如何在Spring Cloud項目中集成RabbitMQ,并創(chuàng)建一個簡單的消息隊列,感興趣的朋友一起看看吧2024-03-03
RestTemplate Get請求實現(xiàn)bean參數(shù)傳遞詳解
RestTemplate 是從 Spring3.0 開始支持的一個 HTTP 請求工具,也有的稱之為網(wǎng)絡框架,說白了就是Java版本的一個postman,這篇文章主要介紹了詳解RestTemplate 用法,需要的朋友可以參考下2022-11-11
Spring?Data?JPA查詢方式及方法名查詢規(guī)則介紹
這篇文章主要介紹了Spring?Data?JPA查詢方式及方法名查詢規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

