(1)单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
(2)单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除。
双向链表的遍历方法和单链表一样,只是可以向前,也可以向后查找。
//显示链表(遍历)public void show() {//判断链表是否为空if ( == null) {System.out.println("链表为空");return;}//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = ;while (true) {//判断是否到链表最后if (temp == null) {break;}//输出节点信息System.out.println(temp);//将temp后移temp = ;}}//主程序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,"林冲","豹子头");DoubleSingleLikedList singleLikedList = new DoubleSingleLikedList();singleLikedList.addLast(hero1);singleLikedList.addLast(hero2);singleLikedList.addLast(hero3);singleLikedList.addLast(hero4);System.out.println("====遍历链表信息====");singleLikedList.show();}
默认添加到双向链表最后。
(1)先找到双向链表的最后一个节点,赋给temp;
(2 = newHer
//添加节点到双向链表最后public void addLast(HeroNode heroNode) {//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = head;while ( != null){temp = ;//遍历到最后一个节点,赋给 = heroNode;heroNode.pre = temp;}//主程序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,"林冲","豹子头");DoubleSingleLikedList singleLikedList = new DoubleSingleLikedList();singleLikedList.addLast(hero1);singleLikedList.addLast(hero2);singleLikedList.addLast(hero3);System.out.println("====添加前遍历链表信息====");singleLikedList.show();System.out.println("====添加后遍历链表信息====");singleLikedList.addLast(hero4);singleLikedList.show();}
修改节点的信息,根据编号no来修改,即编号no不能改。
//修改节点的信息,根据编号no来修改,即编号no不能改public void update(HeroNode heroNode){//判断链表是否为空if ( == null){System.out.println("链表为空");return;}//根据编号no找到需要修改的节点//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = ;boolean flag = false;//表示是否找到该节点while(true){if(temp == null){//表示链表已经遍历结束break;} == ){//表示找到了flag = true;break;}temp = ;}//根据flag判断是否找到要修改的节点if(flag){temp.name = heroNode.name;temp.nickname = heroNode.nickname;}else {System.out.printf("没有找到编号%d的节点,不能修改n",);}}//主程序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(1,"宋押司","及时雨~~");DoubleSingleLikedList singleLikedList = new DoubleSingleLikedList();singleLikedList.addLast(hero1);singleLikedList.addLast(hero2);singleLikedList.addLast(hero3);singleLikedList.addLast(hero4);System.out.println("====修改前遍历链表信息====");singleLikedList.show();System.out.println("====修改后遍历链表信息====");singleLikedList.update(hero5);singleLikedList.show();}
(1)因为是双向链表,因此可以实现自我删除某个节点;
(2)直接找到要删除的这个节点,比如temp;
(3) = ;
(4pre = temp.pre.
//删除节点public void delete(int no) {//判断链表是否为空if ( == null) {System.out.println("链表为空");return;}//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = ;boolean flag = false;//flag标识是否找到需要删除节点,默认为falsewhile (true) {//判断是否到链表最后if (temp == null) {break;}if ( == no)//找到了需要删除节点的前一个节点{flag = true;break;}//将temp后移temp = ;}if (flag) { = ; != null){pre = temp.pre;}} else {System.out.printf("需要删除节点编号%d不存在", no);}}
public class DoubleLinedListDemo {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,"林冲","豹子头");DoubleSingleLikedList singleLikedList = new DoubleSingleLikedList();singleLikedList.addLast(hero1);singleLikedList.addLast(hero2);singleLikedList.addLast(hero3);singleLikedList.addLast(hero4);System.out.println("====删除前遍历链表信息====");singleLikedList.show();System.out.println("====删除后遍历链表信息====");singleLikedList.delete(4);singleLikedList.show();}
}
//定义SingleLinkedList来管理英雄
class DoubleSingleLikedList {//先初始化一个头节点,头节点不要动,不存放具体数据private HeroNode head = new HeroNode(0, "", "");//返回头节点public HeroNode getHead() {return head;}//显示链表(遍历)public void show() {//判断链表是否为空if ( == null) {System.out.println("链表为空");return;}//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = ;while (true) {//判断是否到链表最后if (temp == null) {break;}//输出节点信息System.out.println(temp);//将temp后移temp = ;}}//添加节点到双向链表最后public void addLast(HeroNode heroNode) {//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = head;while ( != null){temp = ;//遍历到最后一个节点,赋给 = heroNode;heroNode.pre = temp;}//修改节点的信息,根据编号no来修改,即编号no不能改public void update(HeroNode heroNode){//判断链表是否为空if ( == null){System.out.println("链表为空");return;}//根据编号no找到需要修改的节点//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = ;boolean flag = false;//表示是否找到该节点while(true){if(temp == null){//表示链表已经遍历结束break;} == ){//表示找到了flag = true;break;}temp = ;}//根据flag判断是否找到要修改的节点if(flag){temp.name = heroNode.name;temp.nickname = heroNode.nickname;}else {System.out.printf("没有找到编号%d的节点,不能修改n",);}}//删除节点public void delete(int no) {//判断链表是否为空if ( == null) {System.out.println("链表为空");return;}//因为head节点不能动,因此需要新建一个辅助变量tempHeroNode temp = ;boolean flag = false;//flag标识是否找到需要删除节点,默认为falsewhile (true) {//判断是否到链表最后if (temp == null) {break;}if ( == no)//找到了需要删除节点的前一个节点{flag = true;break;}//将temp后移temp = ;}if (flag) { = ; != null){pre = temp.pre;}} else {System.out.printf("需要删除节点编号%d不存在", no);}}}
//定义HeroNode类,每个HeroNode对象就是一个节点
class HeroNode {public int no;public String name;public String nickname;public HeroNode next;//指向下一个节点public HeroNode pre;//指向上一个节点//构造器public HeroNode(int no, String name, String nickname) { = no;this.name = name;this.nickname = nickname;}//重写toString方法public String toString() {return "HeroNode[no=" + no + ",name=" + name + ",nickname=" + nickname + "]";}
}
本文发布于:2024-01-27 18:34:04,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063516451918.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |