Java 反轉(zhuǎn)帶頭結(jié)點的單鏈表并顯示輸出的實現(xiàn)過程
注意:要保證已經(jīng)有Node類和單鏈表的初始化,這樣才能調(diào)用反轉(zhuǎn)方法并顯示結(jié)果。
方法如下:
//Node<T>指泛型結(jié)點類 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)后的第一個結(jié)點*** for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能為q,因為結(jié)束循環(huán)后,p是最后一個結(jié)點,q是null System.out.print(qq.data+"\t"); } */ }
實現(xiàn)過程如圖所示:
在循環(huán)之前,先把head以及初始p的next斷掉,方便后面的循環(huán);循環(huán)中的q.next=p就是重定向,這一步把原來的next指向p;
不用q=q.next來使q向后移動,因為q結(jié)點的指針重指向后,q的next為空了,無法正確指向下一個結(jié)點。這時用temp結(jié)點來做一下過渡,在q指針重指向之前,把q的下一個結(jié)點賦給temp,即temp=q.next,在重指向后,用q=temp來向后移動;
p=q;q=temp就是往后移動一個結(jié)點,可以繼續(xù)重復(fù)循環(huán)。
循環(huán)結(jié)束時,q為空,p為最后一個結(jié)點,使q作為頭結(jié)點并指向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)后的第一個結(jié)點*** for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能為q,因為結(jié)束循環(huán)后,p是最后一個結(jié)點,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é)點的單鏈表并顯示輸出的實現(xiàn)過程的文章就介紹到這了,更多相關(guān)Java帶頭結(jié)點的單鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring Data Redis實現(xiàn)數(shù)據(jù)緩存的方法
目前在系統(tǒng)架構(gòu)設(shè)計中使用Redis實現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實現(xiàn)數(shù)據(jù)緩存的方法,具有一定的參考價值,需要的朋友可以參考下2018-11-11基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼
這篇文章主要介紹了基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼的相關(guān)資料,需要的朋友可以參考下2015-12-12SpringBoot定時任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法
本篇文章主要介紹了SpringBoot定時任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法,詳細(xì)的介紹了Spring Schedule 與 Quartz 整合的兩種方法,有興趣的可以了解一下。2017-03-03Java的基本數(shù)據(jù)類型和運算方法(必看篇)
下面小編就為大家?guī)硪黄狫ava的基本數(shù)據(jù)類型和運算方法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07泛談Java中的不可變數(shù)據(jù)結(jié)構(gòu)
開發(fā)人員通常認(rèn)為擁有final引用,或者val在Kotlin或Scala中,足以使對象不可變。這篇博客文章深入研究了不可變引用和不可變數(shù)據(jù)結(jié)構(gòu),下面小編來和大家一起學(xué)習(xí)它2019-05-05