單鏈表的增刪改查應用JAVA

package linkedlist;

public class SingleLinkedListDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub ilove you
		//String res=new HeroNode(1, "aa", "bb").toString();
		//System.out.print(res);
		//進行測試
		//先創建節點
		HeroNode heroNode1=new HeroNode(1, "宋江", "及時雨");
		HeroNode heroNode2=new HeroNode(2, "宋江2", "及時雨2");
		HeroNode heroNode3=new HeroNode(3, "宋江3", "及時雨3");
		//創建要給的鏈表
		SingleLinkedlist singleLinkedList=new SingleLinkedlist();
		singleLinkedList.add(heroNode1);
		singleLinkedList.add(heroNode2);
		singleLinkedList.add(heroNode3);
		singleLinkedList.list();
		//測試修改節點的代碼
		HeroNode newHeroNode=new HeroNode(2, "小路", "玉麒麟~~~~");
		singleLinkedList.update(newHeroNode);
		System.out.println("修改後的鏈表輸出");
		singleLinkedList.list();
		//刪除一個節點
		singleLinkedList.del(3);
		System.out.println("刪除後的鏈表輸出");
		singleLinkedList.list();		
	}

}
 class HeroNode {
	public int no;
	public String name;
	public String nickname;
	public HeroNode next;// 指向下一個節點
	// 構造器

	public HeroNode(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}
	// 重寫toString
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" +nickname+" ]";
	}

}
class SingleLinkedlist{
	private HeroNode head=new HeroNode(0, "", "");
	//添加節點到單向鏈表
	//當不考慮編號順序時;
	//找到當前鏈表的最後節點‘
	//將最後這個節點的next指向新的節點
	public void add(HeroNode heroNode){
		//因爲head節點不能動,因此我們需要一個輔助遍歷temp
		HeroNode temp=head;
		//遍歷鏈表,找到最後
		while(true){
			//找到鏈表的最後
			if(temp.next==null){
				break;
			}
			//如果沒有找到最後 就temp後移
			temp=temp.next;
		}
		//當退出while循環時,temp就指向了鏈表的最後
		temp.next=heroNode;
		
	}
	//第二種添加英雄時的,根據排名將英雄插入到指定的位置
	//如果這個排名剛添加失敗,並給出顯示
	public void addByOrder(HeroNode heroNode){
		//因爲頭結點不動,因此我們任然通過輔助指針(變量)來找到一個添加的位置
		//因爲時單鏈表因此我們的temp是位於添加位置的前一個節點,否則插入不了
		HeroNode temp=head;
		boolean flag=false;//標誌添加的編號是否存在,默認爲false;
		while(true){
			if(temp.next==null){
				break;
			}
			if(temp.next.no>heroNode.no){//位置找到,就在temp的後面插入
				break;
			}else if(temp.next.no==heroNode.no){
				flag=true;//說明編號存在
			}
			temp=temp.next;
		}
		//判斷flag的值
		if(flag){
			System.out.printf("準備插入的英雄編號%d存在\n",heroNode.no);
		}else{
			//插入到鏈表中temp後面
			heroNode.next=temp.next;
			temp.next=heroNode;
		}
		
	}
	//修改節點信息,根據no編號來修改,即no編號不能改
	//1.根據newHeroNode的no來修改即可
	public void update(HeroNode newHeroNode){
		//判斷鏈表是否爲空
		if(head.next==null){
			System.out.println("鏈表爲空");
			return;
		}
		//找到需要修改的節點,根據no編號
		//d定義一個輔助變量
		HeroNode temp=head.next;
		boolean flag=false;//表示是否找到該節點
		while(true){
			if(temp==null){
				break;//鏈表已經結束遍歷完
			}
			if(temp.no==newHeroNode.no){
				//找到了
				flag=true;
				break;
			}
			temp=temp.next;
		}
		//根據flag判斷要修改的節點
		if(flag){
			temp.name=newHeroNode.name;
			temp.nickname=newHeroNode.nickname;
		}else{//沒有找到
			System.out.printf("沒有找到 編號爲%d的節點,不能修改爲\n",newHeroNode.no);
			
		}
	}
	//刪除節點
	//1.head不能動因此我們需要一個輔助節點temp找到待刪除節點的前一個節點
	//2.說明我們在比較時候,是temp.no和需要刪除的節點的.no比較
	public void del(int no) {
		HeroNode temp=head;
		boolean flag=false;//標識是否待刪除節點的
		while(true){
			if(temp.next==null){
				break;
			}
			if(temp.next.no==no){
				//找到待刪除結點額前一個
				flag=true;
				break;
			}
			temp=temp.next;//temp後移
			
		}
		if (flag) {
			//可以刪除了
			temp.next=temp.next.next;
			
		}else{
			System.out.printf("要刪除的%d節點不存在\n",no);
		}
		
	}
	
	//顯示鏈表【遍歷】
	public void list(){
		//判斷鏈表是否爲空
		if(head.next==null){
			System.out.print("鏈表爲空");
			return;
		}
		//因爲head節點不能動,因此我們需要一個輔助遍歷temp
		HeroNode temp=head;
		//遍歷鏈表,找到最後
		while(true){
			if(temp==null){
				break;
			}
			//輸出節點信息
			System.out.println(temp);
			//將temp後移
			temp=temp.next;
		}
	}

}
/*
 * 從單鏈表種刪除一個節點
 * 先找到需要刪除這個節點的前一個節點
 * temp.next=temp.next.next;
 * 被刪除的節點不會有其他引用指向,會被垃圾回收機制會刪
 *
 * 
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章