生活随笔
收集整理的這篇文章主要介紹了
单链表进阶学习 二段
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
單鏈表進階學習 二段
單鏈表的反轉
思路:
定義一個新節(jié)點,reserveHead=new HeroNode();利用輔助變量cur遍歷原來的鏈表,每遍歷一個節(jié)點就將其取出,放在新建鏈表的最前端;(這里可能理解上有些難度,舉一個簡單的例子: 首先遍歷到原來鏈表第一個節(jié)點,取出,接到新節(jié)點reserveHead的后面;接著遍歷到原來鏈表的第二個節(jié)點,取出,這個時候把reserveHead的next域指向到新取出的節(jié)點(這里就是原來鏈表的第二個節(jié)點),新取出節(jié)點的next域指向前一個取出的節(jié)點(這里就是原來鏈表的第二個節(jié)點);這樣就構成了擁有兩個有效節(jié)點的單鏈表的反轉。如果一個單鏈表里有更多的節(jié)點,就按照上述的思路遞歸重復)把原來鏈表的頭節(jié)點指向新鏈表的第一個節(jié)點head.next=reserveHead.next;
(注:
反轉意味著要將原鏈表破壞,在原鏈表的基礎上打印逆序的鏈表;而不是新建一個鏈表,把原來的節(jié)點直接取出來接在新鏈表頭的后面直接打印出來。這就是上面第三步思路存在的必要性!!!)
public class SingleLinkedListDemo {public static void main(String
[] args
) {HeroNode hero1
= new HeroNode(1, "呼保義", "宋江");HeroNode hero2
= new HeroNode(2, "玉麒麟", "盧俊義");HeroNode hero3
= new HeroNode(3, "智多星", "吳用");HeroNode hero4
= new HeroNode(4, "入云龍", "公孫勝");HeroNode hero5
= new HeroNode(5, "大刀", "關勝");SingleLinkedList singleLinkedList
= new SingleLinkedList();singleLinkedList
.add(hero1
);singleLinkedList
.add(hero2
);singleLinkedList
.add(hero3
);singleLinkedList
.add(hero4
);singleLinkedList
.add(hero5
);System
.out
.println("原鏈表:");singleLinkedList
.list();System
.out
.println();System
.out
.println("反轉后的鏈表:");reverseList(singleLinkedList
.GetHead());singleLinkedList
.list();}public static void reverseList(HeroNode head
) {if(head
.next
==null
||head
.next
.next
==null
) {return;}HeroNode cur
=head
.next
;HeroNode next
=null
;HeroNode reverseHead
= new HeroNode(0, "", "");while(cur
!=null
) {next
=cur
.next
;cur
.next
=reverseHead
.next
;reverseHead
.next
=cur
;cur
=next
;}head
.next
=reverseHead
.next
;}public static HeroNode
findLastIndexNode(HeroNode head
, int index
) {if (head
.next
== null
) {return null
;}int size
= GetNumber(head
);if (index
<= 0 || index
> size
) {return null
;}HeroNode cur
= head
.next
;for (int i
= 0; i
< size
- index
; i
++) {cur
= cur
.next
;}return cur
;}public static int GetNumber(HeroNode head
) {if (head
.next
== null
) {return 0;}int number
= 0;HeroNode cur
= head
.next
;while (cur
!= null
) {number
++;cur
= cur
.next
;}return number
;}
}
class SingleLinkedList {private HeroNode head
= new HeroNode(0, "", "");public HeroNode
GetHead() {return head
;}public void add(HeroNode heroNode
) {HeroNode temp
= head
;while (true) {if (temp
.next
== null
) {break;}temp
= temp
.next
;}temp
.next
= heroNode
;}public void addByOrder(HeroNode heroNode
) {HeroNode temp
= head
;boolean flag
= false;while (true) {if (temp
.next
== null
) {break;}if (temp
.next
.no
> heroNode
.no
) {break;} else if (temp
.next
.no
== heroNode
.no
) {flag
= true;break;} else {temp
= temp
.next
;}}if (flag
) {System
.out
.printf("已有編號%d,添加失敗~~~\n", heroNode
.no
);} else {heroNode
.next
= temp
.next
;temp
.next
= heroNode
;}}public void update(HeroNode newHeroNode
) {if (head
.next
== null
) {System
.out
.println("鏈表為空~~~");return;}HeroNode temp
= head
.next
;boolean flag
= false;while (true) {if (temp
== null
) {break;} else if (temp
.no
== newHeroNode
.no
) {flag
= true;break;}temp
= temp
.next
;}if (flag
) {temp
.name
= newHeroNode
.name
;temp
.nickname
= newHeroNode
.nickname
;}else {System
.out
.println();System
.out
.printf("沒有找到編號為%d 的好漢,不能刪除😔\n");}}public void del(int no
) {HeroNode temp
= head
;boolean flag
= false;while (true) {if (temp
.next
== null
) {break;} else if (temp
.next
.no
== no
) {flag
= true;break;}temp
= temp
.next
;}if (flag
) {temp
.next
= temp
.next
.next
;} else {System
.out
.println();System
.out
.printf("刪除的數(shù)據(jù)%d不存在呀不存在~~~\n", no
);}}public void list() {if (head
.next
== null
) {System
.out
.println("鏈表為空~~~");return;}HeroNode temp
= head
.next
;while (true) {if (temp
== null
) {break;}System
.out
.println();System
.out
.printf("%-6s",temp
);temp
= temp
.next
;}}}
class HeroNode {public int no
;public String name
;public String nickname
;public HeroNode next
;public HeroNode(int no
, String nickname
, String name
) {this.no
= no
;this.nickname
= nickname
;this.name
= name
;}@Overridepublic String
toString() {return "no= " + no
+ ",nickname= " + nickname
+ ",name = " + name
;}}
總結
以上是生活随笔為你收集整理的单链表进阶学习 二段的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。