10,java双向链表基础代码复现
双向链表总体来说和单链表差别不大,最大的区别就是node结构中多了一个pre指针(变量)指向前一个节点,因为有了之前的单链表基础,双向链表的复现问题少了很多,基本可以不参考老师的代码自主写下来。
1、添加函数(加入到链表最后)
因为此处的添加只需加到最后即可,按照单链表的添加,遍历到最后并更改辅助节点的next指向node和node的pre指向temp即可。
public void add(teamNode1 node){ teamNode1 temp=head; while(true){ if(temp.next==null) break; temp=temp.next; } temp.next=node; node.pre=temp; }
2、显示函数(打印出链表内的所有节点)
今天测试的时候发现昨天好像写错了- -,今天发现最后一个节点的信息无法被打印。后来发现,判断next为null的语句不同于其他函数,此处应该放在输出语句之后,后移语句之前。
public void list(){ if(head.next==null){ System.out.println("链表为空"); return; } teamNode1 temp=head.next; while (true){ System.out.println(temp); if(temp.next==null) break; temp=temp.next; } }
3、更新函数 与单链表的修改函数完全一致
public void update(teamNode1 node){ teamNode1 temp=head; boolean flag=false; while (true){ if(temp.next==null) break; if(temp.no==node.no){ flag=true; break; } temp=temp.next; } if(flag){ temp.name=node.name; temp.point=node.point; }else { System.out.println("未找到要修改的队伍"); } }
4、删除函数
此处与单链表有较大不同,双向链表可实现自我删除,遍历到要删除的节点即可,而非要删的节点的前一个节点。但有个要注意的就是当要删除的函数为链表最后一个函数时,temp的next节点l为空,没有pre指针,也无法将pre指向node,所以在修改前要先判断。
public void delete(int n){ if(head.next==null) { System.out.println("链表为空无法删除"); return ; } boolean flag=false; teamNode1 temp=head; while(true){ if(temp.next==null) break; if(temp.no==n){ flag=true; break; } temp=temp.next; } if(flag&&temp.next!=null){ temp.pre.next=temp.next; temp.next.pre=temp.pre; }else if(flag){ temp.pre.next=temp.next; }else { System.out.println("未找到该位置队伍,无法删除"); } }
5、按顺序加入函数 双向链表addbyorder
思路和单链表的按顺序插入相似,此处的加入到中间,需要先用temp.next.no> node.no找到应该插入的位置与插入位置前一个节点的temp,然后从后往前更改,先更改temp的next节点即要插入位置的后一个节点名为last,将它的pre指向node。然后更改node的next指向last,更改node的pre指向temp,最后更改temp的next指向node。这是比较顺的思路,不会导致有用的信息被覆盖掉。
另外的,与删除链表相对应,此处要多考虑一种加入时要加入到链表尾部时的情况,相对于上面的情况,就不存在last这个节点了,因此不用修改node的next和last的pre。
因为情况比较多,我放弃了布尔值的标识符,用int的标识符,赋予123值来区分情况,1为需要插入,即前后都有节点,2为链表中已有该编号队伍,0为遍历到最后发现没有编号大于他的节点,也没有等于它的节点,所以就是要加在结尾。
public void addbyorder(teamNode1 node){ teamNode1 temp=head; int flag=0; while (true){ if (temp.next==null) break; if(temp.next.no== node.no){ flag=2; break; } if (temp.next.no> node.no){ flag=1; break; } temp=temp.next; } if(flag==1){ temp.next.pre=node; node.next=temp.next; node.pre=temp; temp.next=node; }else if(flag==0){ temp.next=node; node.pre=temp; }else { System.out.println("已有该队伍"); } }