Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出的實(shí)現(xiàn)過程
注意:要保證已經(jīng)有Node類和單鏈表的初始化,這樣才能調(diào)用反轉(zhuǎn)方法并顯示結(jié)果。
方法如下:
//Node<T>指泛型結(jié)點(diǎn)類
public void reverse2(Node<T> head){
Node<T> p=head.next;
Node<T> q=head.next.next;
head.next=null;
p.next=null;
while(q!=null){
Node<T> temp=q.next;
q.next=p;
p=q;
q=temp;
}
q=this.head;
q.next=p;
/*
//想要直接在方法中遍歷輸出可以使用這段代碼 ***p是反轉(zhuǎn)后的第一個(gè)結(jié)點(diǎn)***
for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能為q,因?yàn)榻Y(jié)束循環(huán)后,p是最后一個(gè)結(jié)點(diǎn),q是null
System.out.print(qq.data+"\t");
}
*/
}
實(shí)現(xiàn)過程如圖所示:

在循環(huán)之前,先把head以及初始p的next斷掉,方便后面的循環(huán);循環(huán)中的q.next=p就是重定向,這一步把原來的next指向p;
不用q=q.next來使q向后移動(dòng),因?yàn)閝結(jié)點(diǎn)的指針重指向后,q的next為空了,無法正確指向下一個(gè)結(jié)點(diǎn)。這時(shí)用temp結(jié)點(diǎn)來做一下過渡,在q指針重指向之前,把q的下一個(gè)結(jié)點(diǎn)賦給temp,即temp=q.next,在重指向后,用q=temp來向后移動(dòng);
p=q;q=temp就是往后移動(dòng)一個(gè)結(jié)點(diǎn),可以繼續(xù)重復(fù)循環(huán)。
循環(huán)結(jié)束時(shí),q為空,p為最后一個(gè)結(jié)點(diǎn),使q作為頭結(jié)點(diǎn)并指向p就完成了反轉(zhuǎn)。
整體代碼:
Node類:
public class Node<T>{
public T data;
public Node<T>next;
public Node(T data,Node<T>next){
this.data=data;
this.next=next;
}
public Node(){
this(null,null);
}
public String toString(){
return this.data.toString();
}
}
單鏈表類:
public class SinglyList<T> {
public Node<T> head;
public SinglyList(){
this.head=new Node<T>();
}
public SinglyList(T[] values){
this();
Node<T> rear=this.head;
for(int i=0;i<values.length;i++)
{
rear.next=new Node<T>(values[i],null);
rear=rear.next;
}
}
//輸出方法
public String toString(){
String str=this.getClass().getName()+"(";
for(Node<T>p=this.head.next;p!=null;p=p.next)
{
str+=p.data.toString();
if(p.next!=null)
str+=",";
}
return str+=")";
}
//反轉(zhuǎn)方法
public void reverse2(Node<T> head){
Node<T> p=head.next;
Node<T> q=head.next.next;
head.next=null;
p.next=null;
while(q!=null){
Node<T> temp=q.next;
q.next=p;
p=q;
q=temp;
}
q=this.head;
q.next=p;
/*
//想要直接在方法中遍歷輸出可以使用這段代碼 ***p是反轉(zhuǎn)后的第一個(gè)結(jié)點(diǎn)***
for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能為q,因?yàn)榻Y(jié)束循環(huán)后,p是最后一個(gè)結(jié)點(diǎn),q是null
System.out.print(qq.data+"\t");
}
*/
}
public static void main(String[] args) {
Integer[] a={1,2,4,5,7};
SinglyList<Integer> sl=new SinglyList<>(a);
System.out.println(sl.toString());
sl.reverse2(sl.head);
System.out.println(sl.toString());
}
}
輸出結(jié)果:

到此這篇關(guān)于Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出的實(shí)現(xiàn)過程的文章就介紹到這了,更多相關(guān)Java帶頭結(jié)點(diǎn)的單鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實(shí)例
這篇文章主要介紹了Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Mybatis的sql語句執(zhí)行異常后打印到日志問題
文章介紹了一種Mybatis異常日志打印方案,主要通過Mybatis攔截器獲取執(zhí)行的sql語句,并利用ThreadLocal存儲(chǔ),以避免多線程下的sql語句覆蓋問題,當(dāng)異常發(fā)生時(shí),從ThreadLocal中取出sql語句并打印到單獨(dú)的日志文件中,方便數(shù)據(jù)恢復(fù),該方案經(jīng)過壓力測(cè)試2024-10-10
Java中Hashtable類與HashMap類的區(qū)別詳解
Hashtable的應(yīng)用非常廣泛,HashMap是新框架中用來代替Hashtable的類,也就是說建議使用HashMap,不要使用Hashtable??赡苣阌X得Hashtable很好用,為什么不用呢?這里簡(jiǎn)單分析他們的區(qū)別。2016-01-01
Springboot內(nèi)外部logback多環(huán)境配置詳解
本文主要介紹了Springboot內(nèi)外部logback多環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if)
這篇文章主要介紹了MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Springboot POI導(dǎo)出Excel(瀏覽器)
這篇文章主要為大家詳細(xì)介紹了Springboot POI導(dǎo)出Excel,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

