java代碼單鏈表 java 單向鏈表

用Java語言實(shí)現(xiàn)單向鏈表

1.先定義一個(gè)節(jié)點(diǎn)類

創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過十余年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都做網(wǎng)站、網(wǎng)站建設(shè)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

package com.buren;

public class IntNode {

//定義一個(gè)節(jié)點(diǎn)類

int

info;

//定義屬性,節(jié)點(diǎn)中的值

IntNode next;

//定義指向下一個(gè)節(jié)點(diǎn)的屬性

public IntNode(int

i){ //構(gòu)造一個(gè)next為空的節(jié)點(diǎn)

this(i,null);

}

public IntNode(int i,IntNode

n){ //構(gòu)造值為i指向n的節(jié)點(diǎn)

info=i;

next=n;

}

}

2.再定義一個(gè)鏈表類,這是主要部分

package com.buren;

public class IntSLList {

private IntNode head,tail;

//定義指向頭結(jié)點(diǎn)和尾結(jié)點(diǎn)的指針,

//如果大家看著這個(gè)不像指針的話,那就需要對(duì)指針有更深刻的了解

public

IntSLList(){

//定義一個(gè)空節(jié)點(diǎn)

head=tail=null;

}

public boolean

isEmpty(){

//判斷節(jié)點(diǎn)是否為空

return

head==null;

//這行代碼看起來似乎很神奇,其實(shí)真的很神奇,偶是服了

}

public void addToHead(int el){

//將el插入到頭結(jié)點(diǎn)前

head=new

IntNode(el,head);

//將節(jié)點(diǎn)插入到頭結(jié)點(diǎn)前,作為新的投節(jié)點(diǎn)

if(head==tail){

//給空鏈表插入節(jié)點(diǎn)時(shí)

tail=head;

//頭結(jié)點(diǎn)和尾結(jié)點(diǎn)指向同一個(gè)節(jié)點(diǎn)

}

}

public void addToTail(int

el){

//向鏈表的尾部增加結(jié)點(diǎn)

if(!isEmpty()){

//判斷鏈表是否為空

tail.next=new

IntNode(el);

//新建立一個(gè)值為el的節(jié)點(diǎn),將鏈表的尾結(jié)點(diǎn)指向新節(jié)點(diǎn)

tail=tail.next;

//更新尾指針的指向

}else{

head=tail=new

IntNode(el);

//如果鏈表為空,新建立一個(gè)節(jié)點(diǎn),將頭尾指針同時(shí)指向這個(gè)節(jié)點(diǎn)

}

}

public int

deleteFromHead(){

//刪除頭結(jié)點(diǎn),將節(jié)點(diǎn)信息返回

int

el=head.info;

//取出節(jié)點(diǎn)信息

if(head==tail){

//如果鏈表中只有一個(gè)節(jié)點(diǎn)

head=tail=null;

//刪除這一個(gè)節(jié)點(diǎn)

}else{

head=head.next;

//如果鏈表中不止一個(gè)節(jié)點(diǎn),將頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)作為頭結(jié)點(diǎn)

}

return

el;

//返回原頭結(jié)點(diǎn)的值

}

public int

deleteFromTail(){

//刪除尾結(jié)點(diǎn),返回尾結(jié)點(diǎn)的信息

int

el=tail.info;

//取出尾結(jié)點(diǎn)的值

if(head==tail){

// 如果鏈表中只有一個(gè)節(jié)點(diǎn)

head=tail=null;

//刪除這個(gè)節(jié)點(diǎn)

}else{

IntNode

temp;

//定義中間變量

for(temp=head;temp.next!=tail;temp=temp.next);

//找出尾結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),注意最后的分號(hào),

//這個(gè)for循環(huán)是沒有循環(huán)體的,目的在于找出尾結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)

//在整個(gè)程序中用了很多次這樣的寫法,相當(dāng)經(jīng)典啊

tail=temp;

//將找出來的節(jié)點(diǎn)作為尾結(jié)點(diǎn),刪除原來的尾結(jié)點(diǎn)

tail.next=null;

//將新尾結(jié)點(diǎn)的指向設(shè)為空

}

return

el;

//返回原尾結(jié)點(diǎn)的信息

}

public void

printAll(){

//打印鏈表中所有節(jié)點(diǎn)的信息

if(isEmpty()){

//如果鏈表為空

System.out.println("This

list is

empty!");

//輸出提示信息

return;

//返回到調(diào)用的地方

}

if(head==tail){

//當(dāng)鏈表中只有一個(gè)節(jié)點(diǎn)時(shí)

System.out.println(head.info);

//輸出這個(gè)節(jié)點(diǎn)的信息,就是頭結(jié)點(diǎn)的信息

return;

}

IntNode

temp;

//定義一個(gè)中間變量

for(temp=head;temp!=null;temp=temp.next){

//遍歷整個(gè)鏈表

System.out.print(temp.info+"

");

//輸出每個(gè)節(jié)點(diǎn)的信息

}

System.out.println();

//輸出一個(gè)換行,可以沒有這一行

}

public boolean isInList(int

el){

//判斷el是否存在于鏈表中

IntNode

temp;

//定義一個(gè)中間變量

for(temp=head;temp!=null

temp.info!=el;temp=temp.next);

//將el找出來,注意最后的分

return

temp!=null;

// 如果存在返回true,否則返回flase,這兩行代碼很有思想

}

public void delete(int

el){

//刪除鏈表中值為el的節(jié)點(diǎn)

if(head.info==el

head==tail){

//如果只有一個(gè)節(jié)點(diǎn),并且節(jié)點(diǎn)的值為el

head=tail=null;

//刪除這個(gè)節(jié)點(diǎn)

}else

if(head.info==el){

// 不止一個(gè)節(jié)點(diǎn),而頭結(jié)點(diǎn)的值就是el

head=head.next;

//刪除頭結(jié)點(diǎn)

}else{

IntNode

pred,temp;

//定義兩個(gè)中間變量

for(pred=head,temp=head.next;temp.info!=el

temp.next!=null;pred=pred.next,temp=temp.next);

//跟上面的類似,自己琢磨吧,也是要注意最后的分號(hào)

pred.next=temp.next;

//將temp指向的節(jié)點(diǎn)刪除,最好畫一個(gè)鏈表的圖,有助于理解

if(temp==tail){

//如果temp指向的節(jié)點(diǎn)是尾結(jié)點(diǎn)

tail=pred;

//將pred指向的節(jié)點(diǎn)設(shè)為尾結(jié)點(diǎn),

}

}

}

//下面這個(gè)方法是在鏈表中值為el1的節(jié)點(diǎn)前面插入一個(gè)值為el2的節(jié)點(diǎn),

//用類似的思想可以再寫一個(gè)在鏈表中值為el1的節(jié)點(diǎn)后面插入一個(gè)值為el2的節(jié)點(diǎn)

public boolean insertToList(int el1,int

el2){

//定義一個(gè)插入節(jié)點(diǎn)的方法,插入成功返回true,否則返回false

IntNode

pred,temp; //定義兩個(gè)中間變量

if(isEmpty()){

//判斷鏈表是否為空

return

false;

//如果鏈表為空就直接返回false

}

if(head.info==el1

head==tail){

//如果鏈表中只有一個(gè)節(jié)點(diǎn),并且這個(gè)節(jié)點(diǎn)的值是el1

head=new

IntNode(el2,head);

//新建立一個(gè)節(jié)點(diǎn)

return

true;

}else if(head.info==el1){

IntNode t=new

IntNode(el2);

t.next=head;

head=t;

return

true;

}else{

for(pred=head,temp=head.next;temp!=null

temp.info!=el1;pred=pred.next,temp=temp.next);

if(temp!=null){

IntNode

a=new IntNode(el2);

pred.next=a;

a.next=temp;

return

true;

}else{

System.out.println(el1+"

NOT EXEISTS!");

return

false;

}

}

}

3.下面是測(cè)試代碼

public static void main(String[] args){

IntSLList test=new

IntSLList();

//test.addToHead(7);

test.addToTail(7);

System.out.println(test.insertToList(7,5));

test.printAll();

System.out.println(test.isInList(123));

}

}

java如何實(shí)現(xiàn)單鏈表

/**

* 結(jié)點(diǎn)類

*/

private static class NodeT {

T nodeValue; // 數(shù)據(jù)域

NodeT next; // 指針域保存著下一節(jié)點(diǎn)的引用

Node(T nodeValue, NodeT next) {

this.nodeValue = nodeValue;

this.next = next;

}

Node(T nodeValue) {

this(nodeValue, null);

}

}

求一個(gè)JAVA的單鏈表程序

package OS;

public class IntNode

{

public String name;

//public int run_time=44;

public int run_time=(int)(Math.random()*100);

public IntNode next;

public int num;

public IntNode(int n,String n1){

this(n,n1,null);

}

public IntNode(int n,String n1,IntNode nn){

num=n;

name=n1;

next=nn;

}

}

package OS;

public class IntSLList

{

public IntNode head;//頭尾“指針”

public IntNode tail;

public IntSLList(){

head=tail=null;

}

//判別鏈表是否為空

public boolean isEmpty(){

return head==null;

}

//從鏈表頭部添加結(jié)點(diǎn)————此處的函數(shù)的傳遞參數(shù)是一個(gè)數(shù)值,也就是info

public void addToHead(IntNode some){

some.next=head;

head=some;

if(tail==null)

tail=head;

}

//從鏈表的尾部添加結(jié)點(diǎn)————同上

public void addToTail(IntNode some){

if(!isEmpty())

{

tail.next=some;

tail=tail.next;

}

else

head=tail=some;

}

//從鏈表頭開始刪除

public void deleteFromHead(){

if(head==tail)

head=tail=null;

else{

head=head.next;

}

}

}

用java如何創(chuàng)建一個(gè)單鏈表和雙鏈表

單向鏈表

單向鏈表就是通過每個(gè)結(jié)點(diǎn)的指針指向下一個(gè)結(jié)點(diǎn)從而鏈接起來的結(jié)構(gòu)。

單向鏈表的初始化:這里我所講的鏈表都是頭結(jié)點(diǎn)不參與計(jì)算的,也就是說第一個(gè)結(jié)點(diǎn)都是頭結(jié)點(diǎn)后面的第一個(gè)結(jié)點(diǎn)。所以我要先申明一點(diǎn),這里我把鏈表的初始化放在了構(gòu)造函數(shù)部分,然后析構(gòu)函數(shù)負(fù)責(zé)釋放頭結(jié)點(diǎn)的內(nèi)存。

單向鏈表的創(chuàng)建過程:鏈表的創(chuàng)建就是添加結(jié)點(diǎn)到鏈表的最后,開始是添加一個(gè)結(jié)點(diǎn)到head結(jié)點(diǎn)后面,然后添加一個(gè)結(jié)點(diǎn)到上次添加的結(jié)點(diǎn)后面,每次新建的結(jié)點(diǎn)的指針總是指向NULL指針。從上面的示意圖可以看出,我們需要一個(gè)輔助指針一直指向最后一個(gè)結(jié)點(diǎn),這個(gè)輔助結(jié)點(diǎn)就是為了讓每次添加的結(jié)點(diǎn)都放置在最后一個(gè)位置。

單向鏈表插入結(jié)點(diǎn)過程:源代碼中的的插入結(jié)點(diǎn)函數(shù)我設(shè)置了一個(gè)指定位置,就是在指定位置插入結(jié)點(diǎn)。首先,通過位置變量position讓ptemp結(jié)點(diǎn)移動(dòng)到要插入位置的前一個(gè)位置,然后接下來的過程就是和創(chuàng)建鏈表的過程是一樣的,把新建的結(jié)點(diǎn)添加到ptemp的后面。這里變量position可以從1到鏈表長(zhǎng)度加1,意思就是如果不算頭結(jié)點(diǎn)的話有3個(gè)結(jié)點(diǎn),那你的position變量就可以從1到4,這是因?yàn)閜temp指針可以到第3個(gè)結(jié)點(diǎn)的位置,所以新建結(jié)點(diǎn)的位置就可以到4了。

單向鏈表刪除結(jié)點(diǎn)過程:源代碼中的刪除結(jié)點(diǎn)函數(shù)也有一個(gè)指定位置變量,為了刪除指定位置的結(jié)點(diǎn)。和插入結(jié)點(diǎn)一樣通過變量position把ptemp移動(dòng)到要?jiǎng)h除結(jié)點(diǎn)的前一個(gè)位置,然后讓ptemp結(jié)點(diǎn)中的指針指向要?jiǎng)h除結(jié)點(diǎn)后面的一個(gè)結(jié)點(diǎn),也就是ptemp結(jié)點(diǎn)的下一個(gè)的下一個(gè)結(jié)點(diǎn),雖然這個(gè)結(jié)點(diǎn)可能為空,但是程序還是正常運(yùn)行。但是這里和插入結(jié)點(diǎn)不同的是變量position只能從1到鏈表的長(zhǎng)度,是因?yàn)閜temp移動(dòng)到最后一個(gè)結(jié)點(diǎn)的時(shí)候,它的下一個(gè)結(jié)點(diǎn)為空,所以不不需要參與刪除了。

雙向鏈表

1.聽名字可能就能猜到雙向鏈表就是鏈表結(jié)點(diǎn)包含兩個(gè)指針,一個(gè)指針是指向下一個(gè)結(jié)點(diǎn)的,另一個(gè)指針當(dāng)然就是指向上一個(gè)結(jié)點(diǎn)的。

2.雙向鏈表的初始化:由于這里的鏈表頭結(jié)點(diǎn)不參與計(jì)算,所以頭結(jié)點(diǎn)的pPre指針是一直指向NULL指針的。

3.雙向鏈表的創(chuàng)建過程:由于雙向鏈表的每個(gè)結(jié)點(diǎn)包含兩個(gè)指針那么這個(gè)時(shí)候我們就要小心處理好每一個(gè)指針的指向,要不然會(huì)有很多意想不到的錯(cuò)誤。同樣的,和單向鏈表的創(chuàng)建過程一樣,需要一個(gè)輔助指針來指向最后一個(gè)結(jié)點(diǎn),然后每新建一個(gè)結(jié)點(diǎn),這個(gè)結(jié)點(diǎn)的pNext指針都是指向NULL指針的,pPre指針指向上一個(gè)結(jié)點(diǎn)(這是和單向鏈表不同的地方),然后讓上一個(gè)指針的pNext指向新建的結(jié)點(diǎn),這樣整個(gè)鏈表就連接起來了。

4.雙向鏈表插入結(jié)點(diǎn)過程:知道了雙向鏈表的創(chuàng)建過程,那么插入結(jié)點(diǎn)的過程就大同小異 了,有一點(diǎn)需要特別注意的就是這里的變量position范圍也是從1到鏈表長(zhǎng)度加1,但是如果待插入的位置是最后一個(gè)位置的話,情況就不同了,看到下面的圖我們可以很好的理解,因?yàn)闆]新建一個(gè)結(jié)點(diǎn)的時(shí)候都需要處理兩個(gè)指針,而且新建結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的pPre指針就需要指向這個(gè)新建的結(jié)點(diǎn),但是有可能這個(gè)新建的結(jié)點(diǎn)可能就已經(jīng)是最后一個(gè)結(jié)點(diǎn)了,那么這個(gè)時(shí)候再執(zhí)行

ptemp-pNext-pPre?=?pnew;

這條指令的時(shí)候就會(huì)報(bào)錯(cuò)了,因?yàn)閜temp-pNext已經(jīng)是個(gè)NULL指針了,那空指針哪里還有pPre呢。因此在程序中要進(jìn)行一次判斷,看看結(jié)點(diǎn)是否是最后一個(gè)結(jié)點(diǎn)。

5.雙向鏈表刪除結(jié)點(diǎn)的過程:要注意的問題和插入結(jié)點(diǎn)一樣,看看這個(gè)結(jié)點(diǎn)是否為NULL。這里就不重復(fù)了。

java數(shù)據(jù)結(jié)構(gòu)單鏈表

你的問題很好理解。但是你的代碼問題嚴(yán)重。

1、你想用java代碼實(shí)現(xiàn)還是c代碼實(shí)現(xiàn)?從你的代碼看是c語言

2、第一段代碼中的結(jié)構(gòu)體nod是不是應(yīng)該寫成Node?

3、inset函數(shù)中,鏈表L是有變化的,所以要用指針。結(jié)點(diǎn)s是不改變的,所以不應(yīng)該用指針

4、既然s不是用指針,后面的s-next自然也不能這么寫了。

用java單鏈表實(shí)現(xiàn)一元多項(xiàng)式相加的算法?

public class Test {

public static void main(String[] args) {

try{

LinkList list1 = new LinkList();

LinkList list2 = new LinkList();

LinkList list3 = null;

list1.addAt(0, new Item(1, 5));

list1.addAt(1, new Item(-1.5, 3));

list1.addAt(2, new Item(1, 1));

list2.addAt(0, new Item(0.5, 5));

list2.addAt(1, new Item(0.5, 4));

list2.addAt(2, new Item(1.5, 3));

list2.addAt(3, new Item(3, 0));

list3 = mergeLinkList(list1, list2);

System.out.println("一元多項(xiàng)式的相加過程:");

list1.listAll();

System.out.println(" + ");

list2.listAll();

System.out.println(" = ");

list3.listAll();

}

catch(Exception e){

e.printStackTrace();

}

}

/**

* 一元多項(xiàng)式的一般項(xiàng)類

*/

class Item{

private double coef; ?//一元多項(xiàng)式的一般項(xiàng)的系數(shù)

private int exp; ? //一元多項(xiàng)式的一般項(xiàng)的指數(shù)

public Item(){

this.coef = 0.0;

this.exp = 0;

}

public Item(double coef, int exp){

this.coef = coef;

this.exp = exp;

}

public double getCoef(){

return this.coef;

}

public void setCoef(double coef){

this.coef = coef;

}

public int getExp(){

return this.exp;

}

public void setExp(int exp){

this.exp = exp;

}

}

/**

* 鏈表結(jié)點(diǎn)類

*/

class Node{

private Item data;

private Node next; ? //鏈表結(jié)點(diǎn)的指針域,指向直接后繼結(jié)點(diǎn)

public Node(){

data = null;

next = null;

}

public Node(Item data, Node next){

this.data = data;

this.next = next;

}

public Item getData(){

return this.data;

}

public void setData(Item data){

this.data = data;

}

public Node getNext(){

return this.next;

}

public void setNext(Node next){

this.next = next;

}

}

/**

* 鏈表類

*/

class LinkList{

private Node head = null; //頭結(jié)點(diǎn)指針

private int size = 0;

public LinkList(){

head = new Node();

size = 0;

}

//在i位置插入元素elem

public boolean addAt(int i, Item elem) {

if(i 0 || i size){

return false;

}

Node pre,curr;

int pos;

for(pre=head; i0 pre.getNext()!=null; i--,pre=pre.getNext());

curr = new Node(elem, pre.getNext());

pre.setNext(curr);

size++;

return true;

}

//刪除i位置的元素

public boolean removeAt(int i) {

if(i 0 || i = size){

return false;

}

Node pre,curr;

for(pre=head; i0 pre.getNext()!=null; i--,pre=pre.getNext());

curr = pre.getNext();

pre.setNext(curr.getNext());

size--;

return true;

}

java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java?技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。

當(dāng)前名稱:java代碼單鏈表 java 單向鏈表
URL分享:http://muchs.cn/article40/doscjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司移動(dòng)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、小程序開發(fā)網(wǎng)頁設(shè)計(jì)公司、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司