我的Java数据结构学习-4-2---链表 (CRUD)
节点对象:
package Demo1.LinkeList; public 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; } @Override public String toString() { return "HeroNode{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + '\'' + ", next=" + next + '}'; } }
链表对象:
初始化头节点:
//初始化头节点,一般不会动他 private HeroNode headNode = new HeroNode(0, "", "");
添加:
/添加节点到单向链表(顺序添加) public void addNode(HeroNode heroNode) { //不考虑编号顺序时候,找到当前链表的最后节点,将最后的节点的next域 指向新节点 //因为head不能动,需要辅助指针(遍历链表) //System.out.println(heroNode); HeroNode temp = headNode; //遍历链表,找到当前链表的最后一位 while (true) { //什么时候说明链表已经遍历到最后了,如果temp.next = null if (temp.next == null) { break; } //如果没有找到最后,temp的指针next域一致后移。 temp = temp.next; } //退出while循环时,temp一定指向链表的最后 temp.next = heroNode; // prinfList(); }
乱序添加,顺序加入:
//将节点插入到指定位置(!!)乱序插入,顺序排列 public void addByOrder(HeroNode heroNode){ //不能动head,所以使用辅助指针。 HeroNode temp = headNode; //原始temp[data|next] -------temp-1【data|next】 //现在是想要:temp[data|next] -----插入数据【data|next】--------temp-1【data|next】 boolean tag = false;//标识添加编号是否存在 while (true){ if (temp.next==null){//说明已经到链表的最后了 break; } if (temp.next.no>heroNode.no){//位置找到了 break; } if (temp.next.no==heroNode.no){ //存在该节点 tag = true; break; } temp = temp.next; } //判断找到没有 if (tag){ //不能添加,说明编号存在!提示信息待插入的编号已经存在 System.out.printf("准备插入的信息,已经存在:%d,不能加入\n",heroNode.no); }else { //插入到节点后面 heroNode.next = temp.next; temp.next = heroNode; } }
修改节点信息,根据编号修改:
//修改节点的信息,根据编号来修改, public void updateNode(HeroNode heroNode){ //判断链表是不是空的 if (headNode.next==null){ System.out.println("链表为空"); return; } //辅助指针 HeroNode temp = headNode; boolean tag = false;//表示是否找到 //找到目标节点 while (true){ if (temp==null){ break;//已经走到了最后了,遍历完了未找到 } if (temp.no==heroNode.no){ //找到了 tag = true; break; } temp = temp.next; } if (tag){ temp.name =heroNode.name; temp.nickName = heroNode.nickName; }else { System.out.printf("未找到该【】目标节点,检查编号是否存在【%d】",heroNode.no); } }
删除节点:
//删除节点 public void deleteNode(int nio){ if (headNode.next==null){ System.out.println("链表为空!!"); return; } HeroNode temp = headNode; boolean flag = false; while (true){ if (headNode.next==null){ break;//走到了最后 } if (temp.next.no == nio){//找到待删除的前一个结点。 flag=true; break;//找到了就退出 } temp = temp.next;//temp 后移 } if (flag){ //找了 temp.next = temp.next.next; }else { System.out.printf("节点不存在:【%d】\n",nio); } }
控制台打印链表信息:
//显示链表信息【遍历打印链表】 public void prinfList(){ //判断链表是不是为空 if (headNode.next ==null){ System.out.println("链表为空::!!"); return; } //头节点不能动,同样需要辅助遍历 HeroNode temp = headNode.next; while (true){ //判断链表是否是最后一个 if (temp ==null){ break; } //如果不为空 System.out.println(temp); //还需要将temp后移,一定 temp =temp.next; } }
测试:
package Demo1.LinkeList; public class LinkedListTest { //测试 public static void main(String[] args) { //准备数据,创建几个节点。 HeroNode heroNode1 = new HeroNode(1, "顺悟空", "孙行者"); HeroNode heroNode2 = new HeroNode(2, "郭童", "白嫖当"); HeroNode heroNode3 = new HeroNode(3, "李四", "隔壁老李"); HeroNode heroNode4 = new HeroNode(4, "王五", "隔壁老五"); //创建链表 SingleLinkedList singleLinkedList = new SingleLinkedList(); //将节点加入链表 singleLinkedList.addNode(heroNode1); singleLinkedList.addNode(heroNode4); singleLinkedList.addNode(heroNode3); singleLinkedList.addNode(heroNode2); //根据编号自动排序加入 // singleLinkedList.addByOrder(heroNode1); // singleLinkedList.addByOrder(heroNode4); // singleLinkedList.addByOrder(heroNode3); // singleLinkedList.addByOrder(heroNode2); // singleLinkedList.addByOrder(heroNode3); singleLinkedList.prinfList(); System.out.println("-======================================-"); //测试修改节点的代码 HeroNode newheroNode2 = new HeroNode(2, "郭童", "白嫖郭"); singleLinkedList.updateNode(newheroNode2); //测试删除节点 singleLinkedList.deleteNode(4); //显示单链 singleLinkedList.prinfList(); } }
HeroNode{no=1, name='顺悟空', nickName='孙行者', next=HeroNode{no=4, name='王五', nickName='隔壁老五', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}}}
HeroNode{no=4, name='王五', nickName='隔壁老五', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}}
HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}
HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}
-======================================-
HeroNode{no=1, name='顺悟空', nickName='孙行者', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}}}
HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}}
HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
Java入门到入坟
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!