代码实现
//创建一个双向链表 class DoubleLinkedListDemo{ //先初始化一个头结点,头结点不要动,不存放具体的数据 private DoubleNode head = new DoubleNode(0,"",""); //返回头结点 public DoubleNode getHead(){ return head; } //遍历双向链表的方法 public void list(){ //判断链表是否为空 if (head.next==null){ System.out.println("链表为空"); return; } //因为头结点不能动,所以我们需要一个辅助变量来遍历 DoubleNode temp = head.next; while (true){ //判断链表是否到了最后 if (temp==null){ break; } //输出节点信息 System.out.println(temp); //将节点后移 temp=temp.next; } } //添加节点,默认添加到双向链表到尾部 public void add(DoubleNode doubleNode){ //因为head节点不能动,因此我们需要一个辅助遍历temp DoubleNode temp = head; //遍历链表找到最后 while (true){ //找到链表的最后 if (temp.next==null){ break; } //如果还没有找到最后,那么将temp向后移动 temp=temp.next; } //当退出while循环的时候,temp就指向了链表的最后 //然后将我们的节点插入到next后面,指向新的节点 temp.next=doubleNode; //让最后一个节点的下一个节点等于我们的新节点 doubleNode.pre=temp; //我们新节点的前一个节点,指向最后一个节点 //通过上面两行代码,我们的双向链表就此实现 } //添加节点,按照编号来排序 public void add2(DoubleNode doubleNode){ //因为头结点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置 //因为双链表,因此我们找的temp位于添加位置的前一个节点,否则插入不了 DoubleNode temp = head; boolean flag = false; //标识添加的编号是否存在,默认为false while (true){ if(temp.next==null){ //说明temp在链表的最后 break; } if (temp.next.no>doubleNode.no){ //位置找到了,就在这个temp的前面插入 break; } if (temp.next.no==doubleNode.no){ //说明添加的hero存在,不能添加 flag = true; break; } temp = temp.next; //后移,遍历当前的链表 } //判断flag的值 if (flag){ //不能添加说明有了这个编号存在 System.out.printf("准备插入的编号 %d 已经存在,无法添加\n",doubleNode.no); }else { if (temp.next!=null){ //如果不是插入到最后 doubleNode.pre = temp; temp.next.pre = doubleNode; doubleNode.next = temp.next; temp.next = doubleNode; }else { //插入到最后 doubleNode.pre = temp; doubleNode.next = null; temp.next = doubleNode; } } } //修改节点信息 public void update(DoubleNode doubleNode){ //判断是否为空 if (head.next == null){ System.out.println("链表为空"); return; } //找到需要修改的节点,根据no来找 //定义一个辅助变量 DoubleNode temp = head.next; boolean flag = false; //表示是否找到该节点 while(true){ if (temp==null){ break;//表示链表已经遍历完了 } if (temp.no==doubleNode.no){ //找到了 flag = true; break; } temp = temp.next; } //根据flag,判断是否找到要修改的节点 if (flag == true){ temp.name = doubleNode.name; temp.nickName = doubleNode.nickName; }else { //没有这个节点 System.out.printf("没有找到编号等于%d的节点,不能修改\n",doubleNode.no); } } //删除一个节点 public void delete(int no){ //对于双向链表我们可以直接找到要删除的节点 DoubleNode temp = head.next; //辅助变量 //判断当前列表是否为空,如果为空我就不去删除了 if (temp.next==null){ System.out.println("当前链表为空,无法删除"); return; } boolean flag = false; //标志是否找到删除节点 while (true){ if (temp==null){ //说明到了链表的最后了 break; } if (temp.no==no){ //找到删除的节点 flag=true; break; } temp=temp.next; } //判断flag if (flag){ //删除节点temp temp.pre.next = temp.next; //这里我们的代码有问题 //这里我们需要判断,如果是最后一个节点,就不需要执行下面这一句代码 if (temp.next!=null){ temp.next.pre=temp.pre; } }else{ System.out.printf("要删除的节点%d不存在\n",no); } } }结果: