日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

转: 单链表反转

發(fā)布時(shí)間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转: 单链表反转 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)

? ? 【轉(zhuǎn)自】http://blog.csdn.net/guyuealian/article/details/51119499(一)單鏈表的結(jié)點(diǎn)結(jié)構(gòu): 
? ????data域:存儲(chǔ)數(shù)據(jù)元素信息的域稱(chēng)為數(shù)據(jù)域; 
? ??next域:存儲(chǔ)直接后繼位置的域稱(chēng)為指針域,它是存放結(jié)點(diǎn)的直接后繼的地址(位置)的指針域(鏈域)。
? ??data域+ next域:組成數(shù)據(jù)ai的存儲(chǔ)映射,稱(chēng)為結(jié)點(diǎn)

? ??注意:①鏈表通過(guò)每個(gè)結(jié)點(diǎn)的鏈域?qū)⒕€性表的n個(gè)結(jié)點(diǎn)按其邏輯順序鏈接在一起的。   
? ? ? ? ? ②每個(gè)結(jié)點(diǎn)只有一個(gè)鏈域的鏈表稱(chēng)為單鏈表(Single Linked List)。
? ? ?所謂的鏈表就好像火車(chē)車(chē)廂一樣,從火車(chē)頭開(kāi)始,每一節(jié)車(chē)廂之后都連著后一節(jié)車(chē)廂。
? ? ?要實(shí)現(xiàn)單鏈表存儲(chǔ),首先是創(chuàng)建一結(jié)點(diǎn)類(lèi),其Java代碼如下:
[java]?view plaincopy
  • class?Node?{??
  • ????private?int?Data;//?數(shù)據(jù)域??
  • ????private?Node?Next;//?指針域??
  • ????public?Node(int?Data)?{??
  • ????????//?super();??
  • ????????this.Data?=?Data;??
  • ????}??
  • ????public?int?getData()?{??
  • ????????return?Data;??
  • ????}??
  • ????public?void?setData(int?Data)?{??
  • ????????this.Data?=?Data;??
  • ????}??
  • ??
  • ????public?Node?getNext()?{??
  • ????????return?Next;??
  • ????}??
  • ????public?void?setNext(Node?Next)?{??
  • ????????this.Next?=?Next;??
  • ????}??
  • }??
  • (二)實(shí)現(xiàn)反轉(zhuǎn)的方法:
    ??(1)遞歸反轉(zhuǎn)法
    :在反轉(zhuǎn)當(dāng)前節(jié)點(diǎn)之前先反轉(zhuǎn)后續(xù)節(jié)點(diǎn)。這樣從頭結(jié)點(diǎn)開(kāi)始,層層深入直到尾結(jié)點(diǎn)才開(kāi)始反轉(zhuǎn)指針域的指向。簡(jiǎn)單的說(shuō)就是從尾結(jié)點(diǎn)開(kāi)始,逆向反轉(zhuǎn)各個(gè)結(jié)點(diǎn)的指針域指向,其過(guò)程圖如下所示:
    ? ?head:是前一結(jié)點(diǎn)的指針域(PS:前一結(jié)點(diǎn)的指針域指向當(dāng)前結(jié)點(diǎn))
    ? ?head.getNext():是當(dāng)前結(jié)點(diǎn)的指針域(PS:當(dāng)前結(jié)點(diǎn)的指針域指向下一結(jié)點(diǎn))
    ? ?reHead:是反轉(zhuǎn)后新鏈表的頭結(jié)點(diǎn)(即原來(lái)單鏈表的尾結(jié)點(diǎn))

    Java代碼實(shí)現(xiàn):[java]?view plaincopy
  • package?javatest1;??
  • public?class?javatest1?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Node?head?=?new?Node(0);??
  • ????????Node?node1?=?new?Node(1);??
  • ????????Node?node2?=?new?Node(2);??
  • ????????Node?node3?=?new?Node(3);??
  • ????????head.setNext(node1);??
  • ????????node1.setNext(node2);??
  • ????????node2.setNext(node3);??
  • ??
  • ????????//?打印反轉(zhuǎn)前的鏈表??
  • ????????Node?h?=?head;??
  • ????????while?(null?!=?h)?{??
  • ????????????System.out.print(h.getData()?+?"?");??
  • ????????????h?=?h.getNext();??
  • ????????}??
  • ????????//?調(diào)用反轉(zhuǎn)方法??
  • ????????head?=?Reverse1(head);??
  • ??
  • ????????System.out.println("\n**************************");??
  • ????????//?打印反轉(zhuǎn)后的結(jié)果??
  • ????????while?(null?!=?head)?{??
  • ????????????System.out.print(head.getData()?+?"?");??
  • ????????????head?=?head.getNext();??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?遞歸,在反轉(zhuǎn)當(dāng)前節(jié)點(diǎn)之前先反轉(zhuǎn)后續(xù)節(jié)點(diǎn)?
  • ?????*/??
  • ????public?static?Node?Reverse1(Node?head)?{??
  • ????????//?head看作是前一結(jié)點(diǎn),head.getNext()是當(dāng)前結(jié)點(diǎn),reHead是反轉(zhuǎn)后新鏈表的頭結(jié)點(diǎn)??
  • ????????if?(head?==?null?||?head.getNext()?==?null)?{??
  • ????????????return?head;//?若為空鏈或者當(dāng)前結(jié)點(diǎn)在尾結(jié)點(diǎn),則直接還回??
  • ????????}??
  • ????????Node?reHead?=?Reverse1(head.getNext());//?先反轉(zhuǎn)后續(xù)節(jié)點(diǎn)head.getNext()??
  • ????????head.getNext().setNext(head);//?將當(dāng)前結(jié)點(diǎn)的指針域指向前一結(jié)點(diǎn)??
  • ????????head.setNext(null);//?前一結(jié)點(diǎn)的指針域令為null;??
  • ????????return?reHead;//?反轉(zhuǎn)后新鏈表的頭結(jié)點(diǎn)??
  • ????}??
  • }??
  • ??
  • ????class?Node?{??
  • ????????private?int?Data;//?數(shù)據(jù)域??
  • ????????private?Node?Next;//?指針域??
  • ??
  • ????????public?Node(int?Data)?{??
  • ????????????//?super();??
  • ????????????this.Data?=?Data;??
  • ????????}??
  • ??
  • ????????public?int?getData()?{??
  • ????????????return?Data;??
  • ????????}??
  • ??
  • ????????public?void?setData(int?Data)?{??
  • ????????????this.Data?=?Data;??
  • ????????}??
  • ??
  • ????????public?Node?getNext()?{??
  • ????????????return?Next;??
  • ????????}??
  • ??
  • ????????public?void?setNext(Node?Next)?{??
  • ????????????this.Next?=?Next;??
  • ????????}??
  • ????}??
  • (2)遍歷反轉(zhuǎn)法:遞歸反轉(zhuǎn)法是從后往前逆序反轉(zhuǎn)指針域的指向,而遍歷反轉(zhuǎn)法是從前往后反轉(zhuǎn)各個(gè)結(jié)點(diǎn)的指針域的指向。? ?基本思路是:將當(dāng)前節(jié)點(diǎn)cur的下一個(gè)節(jié)點(diǎn) cur.getNext()緩存到temp后,然后更改當(dāng)前節(jié)點(diǎn)指針指向上一結(jié)點(diǎn)pre。也就是說(shuō)在反轉(zhuǎn)當(dāng)前結(jié)點(diǎn)指針指向前,先把當(dāng)前結(jié)點(diǎn)的指針域用tmp臨時(shí)保存,以便下一次使用,其過(guò)程可表示如下:
    ? ?pre:上一結(jié)點(diǎn)
    ? ?cur:?當(dāng)前結(jié)點(diǎn)
    ? ?tmp:?臨時(shí)結(jié)點(diǎn),用于保存當(dāng)前結(jié)點(diǎn)的指針域(即下一結(jié)點(diǎn))



    Java代碼實(shí)現(xiàn):[java]?view plaincopy
  • package?javatest1;??
  • public?class?JavaTest1?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Node?head?=?new?Node(0);??
  • ????????Node?node1?=?new?Node(1);??
  • ????????Node?node2?=?new?Node(2);??
  • ????????Node?node3?=?new?Node(3);??
  • ??
  • ????????head.setNext(node1);??
  • ????????node1.setNext(node2);??
  • ????????node2.setNext(node3);??
  • ??
  • ????????//?打印反轉(zhuǎn)前的鏈表??
  • ????????Node?h?=?head;??
  • ????????while?(null?!=?h)?{??
  • ????????????System.out.print(h.getData()?+?"?");??
  • ????????????h?=?h.getNext();??
  • ????????}??
  • ????????//?調(diào)用反轉(zhuǎn)方法??
  • ????????//?head?=?reverse1(head);??
  • ????????head?=?reverse2(head);??
  • ??
  • ????????System.out.println("\n**************************");??
  • ????????//?打印反轉(zhuǎn)后的結(jié)果??
  • ????????while?(null?!=?head)?{??
  • ????????????System.out.print(head.getData()?+?"?");??
  • ????????????head?=?head.getNext();??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?遍歷,將當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)緩存后更改當(dāng)前節(jié)點(diǎn)指針?
  • ?????*/??
  • ????public?static?Node?reverse2(Node?head)?{??
  • ????????if?(head?==?null)??
  • ????????????return?head;??
  • ????????Node?pre?=?head;//?上一結(jié)點(diǎn)??
  • ????????Node?cur?=?head.getNext();//?當(dāng)前結(jié)點(diǎn)??
  • ????????Node?tmp;//?臨時(shí)結(jié)點(diǎn),用于保存當(dāng)前結(jié)點(diǎn)的指針域(即下一結(jié)點(diǎn))??
  • ????????while?(cur?!=?null)?{//?當(dāng)前結(jié)點(diǎn)為null,說(shuō)明位于尾結(jié)點(diǎn)??
  • ????????????tmp?=?cur.getNext();??
  • ????????????cur.setNext(pre);//?反轉(zhuǎn)指針域的指向??
  • ??
  • ????????????//?指針往下移動(dòng)??
  • ????????????pre?=?cur;??
  • ????????????cur?=?tmp;??
  • ????????}??
  • ????????//?最后將原鏈表的頭節(jié)點(diǎn)的指針域置為null,還回新鏈表的頭結(jié)點(diǎn),即原鏈表的尾結(jié)點(diǎn)??
  • ????????head.setNext(null);??
  • ??????????
  • ????????return?pre;??
  • ????}??
  • }??
  • ??
  • class?Node?{??
  • ????private?int?Data;//?數(shù)據(jù)域??
  • ????private?Node?Next;//?指針域??
  • ??
  • ????public?Node(int?Data)?{??
  • ????????//?super();??
  • ????????this.Data?=?Data;??
  • ????}??
  • ??
  • ????public?int?getData()?{??
  • ????????return?Data;??
  • ????}??
  • ??
  • ????public?void?setData(int?Data)?{??
  • ????????this.Data?=?Data;??
  • ????}??
  • ??
  • ????public?Node?getNext()?{??
  • ????????return?Next;??
  • ????}??
  • ??
  • ????public?void?setNext(Node?Next)?{??
  • ????????this.Next?=?Next;??
  • ????}??
  • }??
  • ?

    總結(jié)

    以上是生活随笔為你收集整理的转: 单链表反转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。