数据结构:链表
鏈表是有序的列表,但是在內(nèi)存中的存儲是無序的,如下:?
?
?帶頭節(jié)點(diǎn)的單鏈表的增刪改操作
package com.linkedlist;public class SingleLinkedListDemo {public static void main(String[] args){// 創(chuàng)建節(jié)點(diǎn)HeroNode h1 = new HeroNode(1, "宋江", "及時(shí)雨");HeroNode h2 = new HeroNode(2, "盧俊義", "玉麒麟");HeroNode h3 = new HeroNode(3, "吳用", "智多星");HeroNode h4 = new HeroNode(4, "公孫勝", "入云龍");SingleLinkedList list = new SingleLinkedList();// 直接將節(jié)點(diǎn)加到隊(duì)列末尾 // list.add(h1); // list.add(h2); // list.add(h3); // list.add(h4);// 按照編號順序加入list.addByOrder(h1);list.addByOrder(h4);list.addByOrder(h3);list.addByOrder(h2);System.out.println("按照編號順序加入后的鏈表情況...");list.list();// 修改節(jié)點(diǎn)HeroNode newHeroNode = new HeroNode(2, "魯智深", "花和尚");list.update(newHeroNode);System.out.println("修改后的鏈表情況...");list.list();// 刪除節(jié)點(diǎn)list.del(2);list.del(1);System.out.println("刪除后的鏈表情況...");list.list();} }// 定義鏈表,管理結(jié)點(diǎn)HeroNode class SingleLinkedList{// 先初始化一個頭節(jié)點(diǎn),頭節(jié)點(diǎn)不能動private HeroNode head = new HeroNode(0, "", "");// 添加結(jié)點(diǎn)到單向鏈表,直接加到最后結(jié)點(diǎn)的后面public void add(HeroNode heroNode){// 找到當(dāng)前鏈表的最后節(jié)點(diǎn),將最后這個節(jié)點(diǎn)的next,指向新的節(jié)點(diǎn)HeroNode temp = head;while(true){if(temp.next == null){break;}// 如果沒有找到,就將temp后移temp = temp.next;}// 當(dāng)退出while循環(huán)時(shí),temp指向了鏈表的最后一個結(jié)點(diǎn)temp.next = heroNode;}// 修改節(jié)點(diǎn)的信息,根據(jù)no編號來修改,即no編號不能改// 1. 根據(jù)newHeroNode的no來修改public void update(HeroNode newHeroNode){// 判斷是否為空if(head.next == null){System.out.println("鏈表為空...");return;}// 找到需要修改的節(jié)點(diǎn),根據(jù)no編號// 定義一個輔助變量HeroNode temp = head.next;boolean flag = false; // 表示是否找到改節(jié)點(diǎn)while(true){if(temp == null){break; // 到鏈表的最后}if(temp.no == newHeroNode.no){// 找到flag = true;break;}temp = temp.next;}if(flag){temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;}else{ // 沒有找到System.out.printf("沒有找到編號%d的節(jié)點(diǎn),不能修改\n", newHeroNode.no);}}// 刪除節(jié)點(diǎn)// head不能動, 因此我們需要一個temp輔助節(jié)點(diǎn)找到待刪除節(jié)點(diǎn)的前一個節(jié)點(diǎn)public void del(int no){HeroNode temp = head;boolean flag = false; // 標(biāo)志是否找到待刪除節(jié)點(diǎn)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 節(jié)點(diǎn)不存在\n", no);}}// 第二種添加英雄的方式,根據(jù)排名將英雄插入到指定位置public void addByOrder(HeroNode heroNode){// 因?yàn)轭^節(jié)點(diǎn)不能動,因此我們?nèi)匀煌ㄟ^一個輔助指針來幫助找到添加的位置// 因?yàn)槭菃捂湵?因此我們要找到temp是位于添加位置的前一個節(jié)點(diǎn)HeroNode temp = head;boolean flag = false;while(true){if(temp.next == null){// 說明temp已經(jīng)在鏈表的最后break;}if(temp.next.no > heroNode.no){break;}else if(temp.next.no == heroNode.no){flag = true; // 說明編號已經(jīng)存在break;}temp = temp.next;}// 判斷flag的值if(flag){ // 不能添加,說明編號存在System.out.printf("準(zhǔn)備插入的英雄的編號%d已經(jīng)存在,不能加入\n",heroNode.no);}else{// 插入到鏈表中heroNode.next = temp.next;temp.next = heroNode;}}// 顯示鏈表(遍歷)public void list(){// 判斷鏈表是否為空if(head.next == null){System.out.println("判斷鏈表是否為空...");return;}// 因?yàn)轭^節(jié)點(diǎn),不能動,因此需要一個輔助變量來遍歷HeroNode temp = head.next;while(true){// 判斷是否到鏈表最后if(temp == null){break;}// 輸出節(jié)點(diǎn)信息System.out.println(temp);temp = temp.next; // temp后移,指向下一個節(jié)點(diǎn)}} }// 定義HearNode,每個HearNode對象就是一個結(jié)點(diǎn) 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;}@Overridepublic String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickname="+ nickname + "]";}}?
總結(jié)
- 上一篇: 好玩的数学网站
- 下一篇: 前端二十九:两个盒子居中的练习