与C语言大体差不多结构,我在这里用java。
1.首先创建一个LinkListDemo的类
class LinkListDemo{
//先定义一个头节点
private HeroNode head=new HeroNode(0,"","");
public void add(HeroNode heronode) {
//定义一个辅助的节点
HeroNode temp=head;
while(true) {
if(temp.next==null) {
break;
}
temp=temp.next;
}
temp.next=heronode;
}
2.创造在此类中的增加数据的方法,即addChaRu();
public void addChaRu(HeroNode heronode){
//定义一个辅助节点
HeroNode temp=head;//head为头节点
boolean flag=false;
while(true){
if(temp.next==null){
break;
}
if(temp.next.no >heronode.no){//位置找到,添加在后面
break;
}else if(temp.next.no=heronode.no){
//被添加的编号已经存在
flag=true;
break;
}
temp=temp.next;
}
if(flag){
System.out.printf("准备插入的编号%d已经存在,不能加入\n", heronode.no);
}else{
heronode.next=temp.next;
temp.next=heronode;
}
}
3.更新数据的信息updat()根据no进行修改
public void update(HeroNode newHeroNode) {
if(head.next==null) {
System.out.println("链表为空");
return;
}
HeroNode temp=head.next;
boolean flag=false;
//进行链表遍历
while(true) {
if(temp==null) {
break;
}
if(temp.no==newHeroNode.no) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.name=newHeroNode.name;
temp.nickname=newHeroNode.nickname;
}else {
System.out.println("未找到该有的编号");
}
}
相信你看到这里已经明白了其中的道理,那下面的删除就交给你吧
4.删除信息delete()
temp.next=temp.next.next;
这个是关键,可参考update()
5.将打印链表封装在showlist()的方法中
public void showlist() {
if(head.next==null) {
System.out.println("链表为空");
return;
}
HeroNode temp=head.next;
while(true) {
if(temp==null) {break;}
System.out.println(temp);
temp=temp.next;
}
}
数据同样存放在一个类中,即在HeroNode
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 + "]";
}
}
主函数
public static void main(String[] args) {
// TODO Auto-generated method stub
HeroNode hero1=new HeroNode(1,"松江","及时雨");
HeroNode hero2=new HeroNode(2,"王","china");
HeroNode hero3=new HeroNode(3,"梁","哈哈");
HeroNode hero4=new HeroNode(4,"王","靖");
LinkListDemo slist=new LinkListDemo();
slist.addChaRu(hero1);
slist.addChaRu(hero4);
slist.addChaRu(hero2);
slist.addChaRu(hero3);
slist.list();
slist.delete(2);
slist.delete(3);
slist.list();
}
单链表的反转
思路
- 先定义一个结点
reversemem = new HeroNode();
- 从头到尾遍历原来的链表,每遍历一个链表,就将其取出,放在新链表最前端。
- 原来链表的
head.next = reversemem.next;
public static void reverseList(HeroNode mem) {
if(mem.next==null ||mem.next.next ==null) {
return ;
}
HeroNode temp=mem.next;
HeroNode two=null;
HeroNode reversemem=new HeroNode(0,"","");
//member reversemem=mem;
while(temp!=null) {
two=temp.next;//先暂时保存当前结点的下一个结点,后面会用到
temp.next=reversemem.next;//把temp的下一个结点指向新链表最前端
reversemem.next=temp; //将temp连接到新链表
temp=two;//temp后移
/*每一次循环,reversemem.next都会按照原链表的顺序定位到temp,遍历结束,刚到reversemem.next定位到链表最后一个,
此时把reversemem.next地址赋给mem.next,这样就可以倒着来遍历链表*/
}
mem.next=reversemem.next;//头节点拼接,实现反转
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)