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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring Data Redis實(shí)現(xiàn)數(shù)據(jù)緩存的方法
目前在系統(tǒng)架構(gòu)設(shè)計(jì)中使用Redis實(shí)現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實(shí)現(xiàn)數(shù)據(jù)緩存的方法,具有一定的參考價(jià)值,需要的朋友可以參考下2018-11-11微信java開發(fā)之實(shí)現(xiàn)微信主動(dòng)推送消息
這篇文章主要介紹了微信開發(fā)過程中的使用java實(shí)現(xiàn)微信主動(dòng)推送消息示例,需要的朋友可以參考下2014-03-03手動(dòng)實(shí)現(xiàn)將本地jar添加到Maven倉庫
這篇文章主要介紹了手動(dòng)實(shí)現(xiàn)將本地jar添加到Maven倉庫方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Mybatis實(shí)現(xiàn)分頁查詢的詳細(xì)流程
這篇文章主要給大家介紹了關(guān)于Mybatis實(shí)現(xiàn)分頁查詢的詳細(xì)流程,MyBatis是支持普通SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架,需要的朋友可以參考下2023-08-08基于Java HttpClient和Htmlparser實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲代碼
這篇文章主要介紹了基于Java HttpClient和Htmlparser實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲代碼的相關(guān)資料,需要的朋友可以參考下2015-12-12SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xiàn)方法
本篇文章主要介紹了SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xiàn)方法,詳細(xì)的介紹了Spring Schedule 與 Quartz 整合的兩種方法,有興趣的可以了解一下。2017-03-03Java的基本數(shù)據(jù)類型和運(yùn)算方法(必看篇)
下面小編就為大家?guī)硪黄狫ava的基本數(shù)據(jù)類型和運(yùn)算方法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07泛談Java中的不可變數(shù)據(jù)結(jié)構(gòu)
開發(fā)人員通常認(rèn)為擁有final引用,或者val在Kotlin或Scala中,足以使對(duì)象不可變。這篇博客文章深入研究了不可變引用和不可變數(shù)據(jù)結(jié)構(gòu),下面小編來和大家一起學(xué)習(xí)它2019-05-05