本文實(shí)例講述了Java鏈表中添加元素的原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
松嶺網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
1.1基本的鏈表結(jié)構(gòu):
1.2對于鏈表來說,若想訪問鏈表中每個(gè)節(jié)點(diǎn)則需要把鏈表的頭存起來,假如鏈表的頭節(jié)點(diǎn)為head,指向鏈表中第一個(gè)節(jié)點(diǎn),如圖:
1.3使用代碼表示此時(shí)的鏈表
//定義頭節(jié)點(diǎn) private Node head; //節(jié)點(diǎn)個(gè)數(shù) private int size; //無參數(shù)構(gòu)造函數(shù) public LinkedList() { head = null; size = 0; } //獲取鏈表中的元素個(gè)數(shù) public int getSize() { return size; } //返回鏈表是否為空 public boolean isEmpty() { return size == 0; }
2.1初始時(shí),假設(shè)鏈表如下:
2.2 如在鏈表頭添加一個(gè)666元素則需要先將666放進(jìn)一個(gè)節(jié)點(diǎn)里,在節(jié)點(diǎn)里存入這個(gè)元素以及相應(yīng)的next。
操作如下:
第一步:現(xiàn)將666這個(gè)節(jié)點(diǎn)(node)的next指向head,代碼如下:
node.next=head
圖示為:
第二步:然后再將head指向新的節(jié)點(diǎn)666
head=node
圖示為:
通過第一步、第二步,我們就成功將新節(jié)點(diǎn)添加到頭節(jié)上。此時(shí)node這個(gè)變量也就結(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 在鏈表中間添加元素
假設(shè)初始鏈表為:
假設(shè)我們需要在索引為2的位置添加元素666(此時(shí)的索引為2只是用來說明我們此時(shí)需要操作的位置,并不是真正的索引意思)
操作步驟:
1):創(chuàng)建出666這個(gè)節(jié)點(diǎn)
2):使用一個(gè)變量prev來標(biāo)識(shí)在需要插入節(jié)點(diǎn)的地方的前一個(gè)節(jié)點(diǎn),初始時(shí)prev和頭節(jié)點(diǎn)head是相同的。
對于此處我們需要在索引為2的位置插入新元素,我們只需要找到索引為2的前一個(gè)位置(索引為1),然后把prev指向索引為1節(jié)點(diǎn)即可。
3):進(jìn)行元素添加操作
第一步:先將node的next指向prev的下一個(gè)節(jié)點(diǎn)元素
node.next=prev.next
第二步:再將prev的next指向node
prev.next=node
通過第一步、第二步即可將新元素插入到索引為2的地方。
從上不難看出,對于在鏈表中添加元素關(guān)鍵是找到要添加的節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),因此對于在索引為0的節(jié)點(diǎn)添加元素就需要單獨(dú)處理。
關(guān)于在鏈表中間添加元素的代碼:
//在鏈表的index(0--based)的位置添加新的元素e (實(shí)際不常用,練習(xí)用) public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("位置不合法"); } //對于頭節(jié)點(diǎn)的特殊處理 if (index == 0) { addFirst(e); } else { Node prev = head; for (int i = 0; i < index - 1; i++) {//獲取到需要添加元素位置的前一個(gè)元素 prev = prev.next; } Node node = new Node(e); node.next = prev.next; prev.next = node; size++; } }
此時(shí)代碼等同于:
//在鏈表的index(0--based)的位置添加新的元素e (時(shí)間不常用,練習(xí)用) public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("位置不合法"); } //對于頭節(jié)點(diǎn)的特殊處理 if (index == 0) { addFirst(e); } else { Node prev = head; for (int i = 0; i < index - 1; i++) {//獲取到需要添加元素位置的前一個(gè)元素 prev = prev.next; } // Node node = new Node(e); // node.next = prev.next; // prev.next = node; prev.next=new Node(e,prev.next); size++; } }
這里復(fù)用上述的add()方法
//在鏈表末尾添加新的元素 public void addLast(E e){ add(size,e); }
本小節(jié)完整代碼:
package LinkedList; public class LinkedList{ //將Node節(jié)點(diǎn)設(shè)計(jì)成私有的類中類 private class Node { public E e; public Node next; //兩個(gè)參數(shù)的構(gòu)造函數(shù) public Node(E e, Node next) { this.e = e; this.next = next; } //一個(gè)參數(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é)點(diǎn) private Node head; //節(jié)點(diǎn)個(gè)數(shù) private int size; //無參數(shù)構(gòu)造函數(shù) public LinkedList() { head = null; size = 0; } //獲取鏈表中的元素個(gè)數(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 (實(shí)際不常用,練習(xí)用) public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("位置不合法"); } //對于頭節(jié)點(diǎn)的特殊處理 if (index == 0) { addFirst(e); } else { Node prev = head; for (int i = 0; i < index - 1; i++) {//獲取到需要添加元素位置的前一個(gè)元素 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é)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。