网站建设价格套餐,福田网站制作报价,小厂建网站,网站建设 需求程序里有几个注释的地方还是需要特别注意的#xff0c;根据单链表自己的逻辑来写一遍双向链表#xff0c;可能有几个细节处理的不到位。
package DataStructures.LinkedList;public class DoubleLinkedListDemo {public static void main(String []args){System.out.println…
程序里有几个注释的地方还是需要特别注意的根据单链表自己的逻辑来写一遍双向链表可能有几个细节处理的不到位。
package DataStructures.LinkedList;public class DoubleLinkedListDemo {public static void main(String []args){System.out.println(双向链表的测试);//先创建节点HeroNode2 hero1 new HeroNode2(1, 宋江, 及时雨);HeroNode2 hero2 new HeroNode2(2, 卢俊义, 玉麒麟);HeroNode2 hero3 new HeroNode2(3, 吴用, 智多星);HeroNode2 hero4 new HeroNode2(4, 林冲, 豹子头);//创建一个双向链表DoubleLinkedList doubleLinkedList new DoubleLinkedList();//添加节点doubleLinkedList.add(hero1);doubleLinkedList.add(hero2);doubleLinkedList.add(hero3);doubleLinkedList.add(hero4);doubleLinkedList.list();HeroNode2 newHeroNode new HeroNode2(4,公孙胜,入云龙);doubleLinkedList.updata(newHeroNode);doubleLinkedList.list();doubleLinkedList.delete(1);doubleLinkedList.list();}
}
class DoubleLinkedList{private HeroNode2 head new HeroNode2(0,,);public HeroNode2 getHead() {return head;}//删除一个节点//说明//对于双向链表直接找到这个节点进行自我删除public void delete(int no){if (head.next null){System.out.println(链表为空无法删除);}//这里要加next因为0是不能删除的HeroNode2 temp head.next;boolean flag false;//这里现在是用temp本身来判断while (temp ! null){if (temp.no no){flag true;break;}temp temp.next;}if (flag){temp.pre.next temp.next;//注意这里会有问题//因为如果删除的节点是最后一个节点下面这句话加上了会出现空指针异常if (temp.next ! null) {temp.next.pre temp.pre;}System.out.println(节点删除成功\n);}else {System.out.printf(没找到编号为 %d 的节点删除失败\n,no);}}//修改一个节点的内容public void updata(HeroNode2 heroNode){if (head.next null){System.out.println(链表为空位无法修改);return;}//这里要用next因为更改的时候头结点不能找HeroNode2 temp head.next;boolean flag false;while(true){if (temp null){break;}if (temp.no heroNode.no){flag true;break;}temp temp.next;}if (flag){temp.name heroNode.name;temp.nickname heroNode.nickname;}else {System.out.printf(没找到 编号为 %d 的节点\n,heroNode.no);}}//添加节点public void add(HeroNode2 newHeroNode){HeroNode2 temp head;while(true){if (temp.next null){break;}temp temp.next;}//while退出后temp就是链表最后节点//形成双向链表temp.next newHeroNode;newHeroNode.pre temp;}//遍历输出public void list(){if (head.next null){System.out.println(链表为空);return;}//这里要加next要不然打印会把头结点打印出来HeroNode2 temp head.next;while (temp ! null){System.out.println(temp);temp temp.next;}}}class HeroNode2{public int no;public String name;public String nickname;public HeroNode2 next; //指向下一个节点public HeroNode2 pre; //指向前一个节点public HeroNode2(int no, String name, String nickname) {this.no no;this.name name;this.nickname nickname;}Overridepublic String toString() {return HeroNode2{ no no , name name \ , nickname nickname \ };}
}加一个添加的时候根据no排序
//添加节点并根据no有序public void addByOrder(HeroNode2 newHeroNode){HeroNode2 temp head;boolean flag false;while (true){if (temp.next null){break;}if (temp.next.no newHeroNode.no){break;}else if (temp.next.no newHeroNode.no){flag true;break;}temp temp.next;}if (flag){System.out.printf(编号 %d 已存在,不能添加\n,newHeroNode.no);}else {//这里注意不要写反了先写if这里再写剩下两个要不然就形成了一个环状这里找了好久bugif (temp.next ! null) {temp.next.pre newHeroNode;newHeroNode.next temp.next;}temp.next newHeroNode;newHeroNode.pre temp;}}测试
doubleLinkedList.addByOrder(hero1);
doubleLinkedList.addByOrder(hero4);
doubleLinkedList.addByOrder(hero2);
doubleLinkedList.addByOrder(hero3);doubleLinkedList.list();结果双向链表的测试
HeroNode2{no1, name宋江, nickname及时雨}
HeroNode2{no2, name卢俊义, nickname玉麒麟}
HeroNode2{no3, name吴用, nickname智多星}
HeroNode2{no4, name林冲, nickname豹子头}