8。单链表初学代码复现及一些不值一提的小问题(1)
今天的数据结构课看到了单链表,因为做题的时候也感觉我虽然对于其概念还是比较明确的,但对其的操作以及一些细微的操作方面还是不够细腻,所以决定自己复现一遍老师的代码。不写不知道,一写吓一跳,就是说一句一卡,时不时想看看原代码,虽然很简单但我还是不断出小问题。
只复现了直接加入最后和指定位置加入以及显示内容三个函数,里面的问题已经数不胜数。
单链表的创建步骤:
1、创建节点类,定义节点内变量和一节点变量为next,写构造器和tostring
2、创建链表类,先初始化一个头节点head,其中不存储数据但仍要在创建时为其赋值
3、添加函数
add函数中:实现新节点加入链表尾部
1、参数为要加入的新节点
2、用遍历找到链表中的最后一个节点,但遍历时头节点不能动,所以新建一个temp临时节点来遍历链表,此处!!temp=head!!
3、用while函数和if结合,判断temp不为null时则将temp=temp.next,将temp后移,为null时用break跳出;
4、跳出while后,此时temp为链表最后一个节点,让其next等于node即完成添加。
list()函数中:实现遍历链表
1、用!!head.next!!是否为null直接判断链表是否为空
2、不为空后,生成temp临时节点,此处!!!temp=head.next!!!这里因为已经确定head.next不为空了!
3、后面正常遍历即可,不要忘了判断完输出以后还要后移即可。
addbyorder函数中:实现新节点加入固定位置:
1、设置temp,此处依旧直接!!temp=head!!
2、设置flag标识符判断该位置是否已经有节点
3、开始遍历,确认temp.next不为空后,比较temp后一节点的编码与要插入的节点的编码,若大于则说明可插入,直接跳出循环即可。若两者相等则说明要插的位置已有数据,将标识符转为true后跳出循环。
4、若flag=true时输出提醒该处无法插入,若可插入则先将temp的后一个节点赋值给新节点的next即node.next=temp.next;再将node赋值给temp的next,temp.next=node;
此函数可以保证不论输入时顺序如何,链表中的顺序始终为按要求排序的顺序。如下输入:
public static void main(String[] args){ teamNode team1=new teamNode(1,"V5","13-2"); teamNode team2=new teamNode(2,"RNG","11-5"); teamNode team3=new teamNode(3,"JDG","11-5"); teamNode team4=new teamNode(4,"TES","11-5"); teamNode team5=new teamNode(5,"WBG","11-5"); Singlelinkedlist singlelinkedlist=new Singlelinkedlist(); singlelinkedlist.addbyorder(team1); singlelinkedlist.addbyorder(team5); singlelinkedlist.addbyorder(team3); singlelinkedlist.addbyorder(team2); singlelinkedlist.addbyorder(team4); singlelinkedlist.list(); }
仍然可得到如下结果:
teamNode{no=1, name='V5', point='13-2'}
teamNode{no=2, name='RNG', point='11-5'}
teamNode{no=3, name='JDG', point='11-5'}
teamNode{no=4, name='TES', point='11-5'}
后续还有修改和删除,只能明天再搞了,明天不仅要早起还是满课,希望能挤出时间吧- -
目前为止代码如下:
package linkedlist; public class SingleLink { public static void main(String[] args){ teamNode team1=new teamNode(1,"V5","13-2"); teamNode team2=new teamNode(2,"RNG","11-5"); teamNode team3=new teamNode(3,"JDG","11-5"); teamNode team4=new teamNode(4,"TES","11-5"); teamNode team5=new teamNode(5,"WBG","11-5"); Singlelinkedlist singlelinkedlist=new Singlelinkedlist(); // singlelinkedlist.add(team1); // singlelinkedlist.add(team2); // singlelinkedlist.add(team3); // singlelinkedlist.add(team4); // singlelinkedlist.add(team5); singlelinkedlist.addbyorder(team1); singlelinkedlist.addbyorder(team5); singlelinkedlist.addbyorder(team3); singlelinkedlist.addbyorder(team2); singlelinkedlist.addbyorder(team4); singlelinkedlist.list(); } } class Singlelinkedlist{ private teamNode head=new teamNode(0,"",""); public void add(teamNode node){ teamNode temp=head; //这里是等于head!! while(true){ if(temp.next==null)break; temp=temp.next; } temp.next=node; } public void list(){ if(head.next==null){ System.out.println("empyt!!"); return; } teamNode temp=head.next; while(true){ if(temp.next==null) break; System.out.println(temp); temp=temp.next; } } public void addbyorder(teamNode node){ teamNode temp=head; boolean flag=false; while (true){ if(temp.next==null) break; if(temp.next.no>node.no){ break; }else if(temp.next.no==node.no){ flag=true; break; } temp=temp.next; //不要忘了后移!! } if(flag){ System.out.println("已有该排名队伍"); }else { node.next=temp.next; //不要忘了更改加入的节点的next应该指向temp当前的next temp.next=node; } } } class teamNode{ public int no; public String name; public String point; public teamNode next; public teamNode(int no, String name, String point) { this.no = no; this.name = name; this.point = point; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPoint() { return point; } public void setPoint(String point) { this.point = point; } @Override public String toString() { return "teamNode{" + "no=" + no + ", name='" + name + '\'' + ", point='" + point + '\'' + '}'; } }