双向链表 小咪咪 2021-08-12 00:11 434阅读 0赞 【一】双向链表 > 单向链表,查找的只能是一个方向,而双向链表可以向前或向后查找。 > 单向链表不能自我删除,需要靠辅助节点;而双向链表可以自我删除 > 双向链表中的节点 > pre data next > pre指向前一个节点的地址 > data存储当前节点的数据 > next指向下一个节点的地址 【二】代码实现 > 实现功能: > 1.遍历双向链表 > 双向链表的遍历和单链表一样,只是可以向前查找,向后查找。 > 2.增加节点、删除节点、修改节点、插入节点 > 添加和单项链表相似:1.找到最后一个节点temp;2.temp.next=node,node.pre=temp; > 修改:和单项链表相同; > 删除(添加至双向链表的末端):1.找到要删除的节点temp;2.temp.pre.next=temp.next;temp.next.pre=temp.pre; > 插入节点:1.找到要插入节点的后一个节点temp;2.temp.pre=node;node.next=temp; > 3.返回头结点 插入节点的示意图: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RoZV9CZXN0X0hhY2tlcg_size_16_color_FFFFFF_t_70][] 代码实现: public class DoubleLinkedList { public static void main(String[] args) { DoubleStudentNode dsn=new DoubleStudentNode(); dsn.add(new StudentNode2(100,"zhangsan","beijing")); dsn.add(new StudentNode2(106,"lisi","shanghai")); dsn.add(new StudentNode2(109,"wangwu","xian")); dsn.add(new StudentNode2(107,"zhaoliu","shanxi")); dsn.list(); //dsn.del(106); System.out.println("----------修改节点"); dsn.updateNode(new StudentNode2(106,"haha","shijiazhuang")); dsn.list(); System.out.println("----------删除节点"); dsn.del(109); dsn.list(); System.out.println("----------插入节点"); dsn.addNodesByOrder(new StudentNode2(103,"wangerxiao","changan")); dsn.list(); } } class DoubleStudentNode{ StudentNode2 head=new StudentNode2(0,"",""); //返回头结点 public StudentNode2 getHead() { return head; } //插入节点 public void addNodesByOrder(StudentNode2 node) { StudentNode2 temp=head; boolean flag=false; while(true) { if(temp.next==null) { break; } if(temp.id>node.id) { break; } if(temp.id==node.id) { flag=true; break; } temp=temp.next; } if(flag) { System.out.printf("id为%d的节点已存在链表中", node.id); }else { temp.pre.next=node; node.pre=temp.pre; node.next=temp; temp.pre=node; } } //修改 public void updateNode(StudentNode2 node) { StudentNode2 temp=head.next; boolean flag=false; if(temp==null) { System.out.println("链表为空,没有要修改的元素"); return; } while(true) { if(temp==null) { break; } if(temp.id==node.id) { flag=true; break; } temp=temp.next; } if(flag) { temp.name=node.name; temp.adress=node.adress; }else { System.out.printf("没有找到id为%d的节点,无法修改", node.id); } } //删除元素 public void del(int id) { if(head.next==null) { System.out.println("链表为空,要删除的节点不存在"); return; } StudentNode2 temp=head.next; boolean flag=false; while(true) { if(temp==null) { break; } if(temp.id==id) { flag=true; break; } temp=temp.next; } if(flag) { temp.pre.next=temp.next; //如果是最后一个节点,不需要执行这句话 if (temp.next!=null) { temp.next.pre=temp.pre; } }else { System.out.printf("要删除id为%d的节点不存在",id); } } //添加元素 public void add(StudentNode2 node) { StudentNode2 temp=head; while(true) { if(temp.next==null) { break; } temp=temp.next; } temp.next=node; node.pre=temp; } //遍历链表 public void list() { StudentNode2 temp=head.next; if(temp==null) { return; } while(temp!=null) { System.out.println(temp); temp=temp.next; } } } //定义双向链表的节点 class StudentNode2{ public int id; public String name; public String adress; public StudentNode2 next; public StudentNode2 pre; StudentNode2(int id,String name,String adress){ this.id=id; this.name=name; this.adress=adress; } @Override public String toString() { return "StudentNode [id=" + id + ", name=" + name + ", adress=" + adress + "]"; } } 【三】输出截图 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RoZV9CZXN0X0hhY2tlcg_size_16_color_FFFFFF_t_70 1][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RoZV9CZXN0X0hhY2tlcg_size_16_color_FFFFFF_t_70]: /images/20210811/1e094db9ae78421ea095cf52bf9f827b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RoZV9CZXN0X0hhY2tlcg_size_16_color_FFFFFF_t_70 1]: /images/20210811/5e915634bb6241ee92ac766003213a96.png
相关 双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空 灰太狼/ 2022年12月21日 04:54/ 0 赞/ 195 阅读
相关 双向链表 一:双向链表 双向链表的节点包含数据域,前置指针域和后置指针域 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_ ゝ一世哀愁。/ 2022年11月05日 12:57/ 0 赞/ 195 阅读
相关 双向链表 APUE 308页 线程学习时候有一个链表 struct job{ struct job next; struct job prev; 古城微笑少年丶/ 2022年08月05日 05:20/ 0 赞/ 190 阅读
相关 双向链表 前面叙述了关于单链表、双端链表、有序链表的结点插入以及遍历查找等示例。这几种链表都只能从前往后进行遍历,反向遍历是非常麻烦的一件事。 考虑一下下面这个情况:如果文本编辑 亦凉/ 2022年07月18日 05:29/ 0 赞/ 217 阅读
相关 双向链表 一、解析 在单链表中,有了next指针,要查找下一节点的时间复杂度为O(1),如果要查找的是上一节点的话,最坏的时间复杂度是O(n)了,以为每次都要从头开始查找。为了克服这个 「爱情、让人受尽委屈。」/ 2022年07月03日 13:57/ 0 赞/ 274 阅读
相关 双向链表 /双向链表/ include<stdio.h> typedef struct dbnode { int num; 骑猪看日落/ 2022年06月16日 13:08/ 0 赞/ 209 阅读
相关 双向链表和双向循环链表 双向链表和双向循环链表 和单向链表相比,多了一个前驱结点。如果他为空,那么next和prior都指向自己。而对于双循环链表,只需要最后一个元素的next指向head->n ╰+哭是因爲堅強的太久メ/ 2022年05月16日 01:29/ 0 赞/ 276 阅读
相关 双向链表 Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱 忘是亡心i/ 2022年05月10日 04:34/ 0 赞/ 284 阅读
相关 双向链表 题目描述 构建一个双向链表并进行删除和插入操作,按要求输出。 输入 输入: 第一行输入元素个数M 第二行输入M个元素 第三行输入删除位置 第四行输入插入位 野性酷女/ 2022年04月04日 05:48/ 0 赞/ 263 阅读
相关 双向链表 【一】双向链表 > 单向链表,查找的只能是一个方向,而双向链表可以向前或向后查找。 > 单向链表不能自我删除,需要靠辅助节点;而双向链表可以自我删除 > 双向链表中的 小咪咪/ 2021年08月12日 00:11/ 0 赞/ 435 阅读
还没有评论,来说两句吧...