单链表的增删改查以及单链表的反转

单链表的增删改查以及单链表的反转,第1张

与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;//头节点拼接,实现反转
	}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/756455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存