链表-单链表

有序列表

  • 链表是以节点的方式来储存的;
  • 每个节点包含data域,next域(指向下一个节点);
  • 链表的各个节点不一定连续存储的;
  • 分为带头节点的链表和没有头结点的链表

单链表(带头节点)逻辑结构示意图

//每一个HeroNode对象就是一个节点
public 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;
    }
}

public class SingleLinkedList
{
    //先初始化一个头结点,头结点不动,不放具体的数据
    private HeroNode head = new HeroNode(0, "", "");
    //添加节点到单向链表
    //当不考虑编号顺序时,1:找到当前链表的最后节点,2:将最后的这个节点指向新的节点
    // 按照编号顺序添加, 1:首先找到新添加的节点的位置,是通过复制变量,2:新的节点.next= temp.next ; 3: temp.next = 新的节点
    public void Add(HeroNode heroNode)
    {
        //head不能动
        HeroNode temp = head;
        while (true)
        {
            if (temp.next == null) break;
            temp = temp.next; //链表后移
        }
        temp.next = heroNode;
    }

    public void AddByOrder(HeroNode heroNode)
    {
        //因为是单链表,找的temp是添加位置的前一个节点,否则加不进去
        HeroNode temp = head;
        bool 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) Console.WriteLine("编号已存在,不能添加");
        else { heroNode.next = temp.next; temp.next = heroNode; }
    }

    public void Update(HeroNode heroNode)
    {
        if (head.next == null) { Console.WriteLine("链表为空"); return; }
        HeroNode temp = head;
        bool flag = false; //编号是否存在
        while (true)
        {
            if (temp.next == null) break;
            if (temp.no > heroNode.no) { flag = true; break; };
            temp = temp.next;
        }
        if (flag) { temp.name = heroNode.name; temp.nickname = heroNode.nickname; }
        else Console.WriteLine("没有找到");
    }

    public void Del(HeroNode heroNode)
    {
        if (head.next == null) { Console.WriteLine("链表为空"); return; }
        HeroNode temp = head;
        bool flag = false; //编号是否存在
        while (true)
        {
            if (temp.next == null) break;
            if (temp.no == heroNode.no) { flag = true; break; };
            temp = temp.next;
        }
        if (flag) { temp.next = temp.next.next; }
        else Console.WriteLine("没有找到");
    }

    public void ShowList()
    {
        //
        if (head.next == null) { Console.WriteLine("链表为空"); return; }
        //因为头结点不能动,因此需要一个辅助变量来遍历
        HeroNode temp = head.next;
        while (true)
        {
            if (temp == null) break;
            Console.WriteLine(string.Format("no={0},name={1},nickname={2}",temp.no,temp.name,temp.nickname));
            temp = temp.next;
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值