Java單鏈表基本操作的實(shí)現(xiàn)
最近被問到鏈表,是一個(gè)朋友和我討論Java的時(shí)候說的。說實(shí)話,我學(xué)習(xí)編程的近一年時(shí)間里,學(xué)到的東西還是挺少的。語(yǔ)言是學(xué)了Java和C#,關(guān)于Web的學(xué)了一點(diǎn)Html+css+javascript。因?yàn)楸容^偏好,學(xué)習(xí)WinForm時(shí)比較認(rèn)真,數(shù)據(jù)庫(kù)操作也自己有所研究。但鏈表這個(gè)東西我還真沒有學(xué)習(xí)和研究過,加上最近自己在看WPF,而課程也到了JSP了,比較緊。
但是我還是抽了一個(gè)晚上加半天的時(shí)間看了一下單向鏈表。并且使用Java試著寫了一個(gè)實(shí)例出來。沒有接觸過鏈表的朋友可以作為參考,希望大家多提寶貴意見。
我們首先解釋一下什么是鏈表。就我所知,鏈表是一種數(shù)據(jù)結(jié)構(gòu),和數(shù)組同級(jí)。比如,Java中我們使用的ArrayList,其實(shí)現(xiàn)原理是數(shù)組。而LinkedList的實(shí)現(xiàn)原理就是鏈表了。我的老師說,鏈表在進(jìn)行循環(huán)遍歷時(shí)效率不高,但是插入和刪除時(shí)優(yōu)勢(shì)明顯。那么他有著愈十年的編程經(jīng)驗(yàn),我是相信的。不過不知道他是否是說雙向鏈表,我們?cè)诖四刂粚?duì)單向鏈表做一個(gè)了解。
鏈表(Chain本文所說鏈表均為單向鏈表,以下均簡(jiǎn)稱單向鏈表)實(shí)際上是由節(jié)點(diǎn)(Node)組成的,一個(gè)鏈表?yè)碛胁欢〝?shù)量的節(jié)點(diǎn)。而向外暴露的只有一個(gè)頭節(jié)點(diǎn)(Head),我們對(duì)鏈表的所有操作,都是直接或者間接地通過其頭節(jié)點(diǎn)來進(jìn)行的。
節(jié)點(diǎn)(Node)是由一個(gè)需要儲(chǔ)存的對(duì)象及對(duì)下一個(gè)節(jié)點(diǎn)的引用組成的。也就是說,節(jié)點(diǎn)擁有兩個(gè)成員:儲(chǔ)存的對(duì)象、對(duì)下一個(gè)節(jié)點(diǎn)的引用。
這樣說可能大家不是很明白,我貼一張圖大家可能更容易理解。

Java單鏈表基本操作的實(shí)現(xiàn)關(guān)鍵代碼如下所示:
package com.tyxh.link;
//節(jié)點(diǎn)類
public class Node {
protected Node next; //指針域
protected int data;//數(shù)據(jù)域
public Node( int data) {
this. data = data;
}
//顯示此節(jié)點(diǎn)
public void display() {
System. out.print( data + " ");
}
}
package com.tyxh.link;
//單鏈表
public class LinkList {
public Node first; // 定義一個(gè)頭結(jié)點(diǎn)
private int pos = 0;// 節(jié)點(diǎn)的位置
public LinkList() {
this. first = null;
}
// 插入一個(gè)頭節(jié)點(diǎn)
public void addFirstNode( int data) {
Node node = new Node(data);
node. next = first;
first = node;
}
// 刪除一個(gè)頭結(jié)點(diǎn),并返回頭結(jié)點(diǎn)
public Node deleteFirstNode() {
Node tempNode = first;
first = tempNode. next;
return tempNode;
}
// 在任意位置插入節(jié)點(diǎn) 在index的后面插入
public void add(int index, int data) {
Node node = new Node(data);
Node current = first;
Node previous = first;
while ( pos != index) {
previous = current;
current = current. next;
pos++;
}
node. next = current;
previous. next = node;
pos = 0;
}
// 刪除任意位置的節(jié)點(diǎn)
public Node deleteByPos( int index) {
Node current = first;
Node previous = first;
while ( pos != index) {
pos++;
previous = current;
current = current. next;
}
if(current == first) {
first = first. next;
} else {
pos = 0;
previous. next = current. next;
}
return current;
}
// 根據(jù)節(jié)點(diǎn)的data刪除節(jié)點(diǎn)(僅僅刪除第一個(gè))
public Node deleteByData( int data) {
Node current = first;
Node previous = first; //記住上一個(gè)節(jié)點(diǎn)
while (current. data != data) {
if (current. next == null) {
return null;
}
previous = current;
current = current. next;
}
if(current == first) {
first = first. next;
} else {
previous. next = current. next;
}
return current;
}
// 顯示出所有的節(jié)點(diǎn)信息
public void displayAllNodes() {
Node current = first;
while (current != null) {
current.display();
current = current. next;
}
System. out.println();
}
// 根據(jù)位置查找節(jié)點(diǎn)信息
public Node findByPos( int index) {
Node current = first;
if ( pos != index) {
current = current. next;
pos++;
}
return current;
}
// 根據(jù)數(shù)據(jù)查找節(jié)點(diǎn)信息
public Node findByData( int data) {
Node current = first;
while (current. data != data) {
if (current. next == null)
return null;
current = current. next;
}
return current;
}
}
package com.tyxh.link;
//測(cè)試類
public class TestLinkList {
public static void main(String[] args) {
LinkList linkList = new LinkList();
linkList.addFirstNode(20);
linkList.addFirstNode(21);
linkList.addFirstNode(19);
//19,21,20
linkList.add(1, 22); //19,22,21,20
linkList.add(2, 23); //19,22,23,21,20
linkList.add(3, 99); //19,22,23,99,21,20
linkList.displayAllNodes();
// Node node = linkList.deleteFirstNode();
// System.out.println("node : " + node.data);
// linkList.displayAllNodes();
// node = linkList.deleteByPos(2);
// System.out.println("node : " + node.data);
// linkList.displayAllNodes();
// linkList.deleteFirstNode();
Node node = linkList.deleteByData(19);
// Node node = linkList.deleteByPos(0);
System. out.println( "node : " + node. data);
linkList.displayAllNodes();
Node node1 = linkList.findByPos(0);
System. out.println( "node1: " + node1. data);
Node node2 = linkList.findByData(22);
System. out.println( "node2: " + node2. data);
}
}
以上所述是小編給大家介紹的Java單鏈表基本操作的實(shí)現(xiàn),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
解決spring boot創(chuàng)建項(xiàng)目遇到配置的問題
這篇文章主要介紹了解決spring boot創(chuàng)建項(xiàng)目遇到配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java中Comparable和Comparator兩種比較器的區(qū)別詳解
這篇文章主要介紹了Java中Comparable和Comparator兩種比較器的區(qū)別詳解,Comparable接口將比較代碼嵌入自身類中,像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實(shí)現(xiàn)了Comparable接口,這些類對(duì)象本身就支持和自己比較,需要的朋友可以參考下2023-09-09
Java 和 Kotlin Lambda 表達(dá)式示例詳解
Lambda 表達(dá)式是一種簡(jiǎn)潔的函數(shù)表達(dá)方式,可以把函數(shù)作為一個(gè)方法的參數(shù),或者將代碼塊轉(zhuǎn)換為數(shù)據(jù)傳遞,這篇文章主要介紹了Java 和 Kotlin Lambda 表達(dá)式示例詳解,需要的朋友可以參考下2024-06-06
Springboot項(xiàng)目監(jiān)聽器失效問題解決
這篇文章主要介紹了Springboot項(xiàng)目監(jiān)聽器失效問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例
這篇文章主要給大家介紹了利用Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例,本文生成的是GIF格式 + 干擾元素,讓驗(yàn)證碼破解難度又上了一個(gè)層次,文中給出了詳細(xì)的示例代碼,并在文末給出了完整的實(shí)例代碼供大家下載學(xué)習(xí),需要的朋友們下面來一起看看吧。2017-04-04

