单向链表的实现(带头节点)

本文介绍了单向链表的基本概念,包括其逻辑结构和链式存储方式,并与数组进行了对比。接着详细讲述了如何创建节点,以及如何构建带有头节点的链表。内容涵盖了链表的添加、删除、查询和节点修改等操作,特别强调了在单向链表中进行这些操作时的注意事项,即需要找到待操作节点的前一个节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向链表基本概念

逻辑结构:线性结构
存储结构(内存的存储的方式):链式存储
与数组比较,逻辑结构相同都是线性结构
不同:数组的存储结构是顺序存储

单向链表的组成

  1. 单向链表由节点组成(Node)

2.每个节点里有存储的数据,和下一个节点的位置

单向链表图示

创建节点(包含数据和下一个节点的地址)

public class Node(){
    //学生名字
    String name;
    //学号
     int id;
    //下一个节点的地址
    Node next;
    //构造方法
     public Node(String name,int id){
         this.name=name;
         this.id=id;
         next=null;
     }
}

创建链表

  • 包含头节
  • 包含节点的添加输出等方法
public class  LinkedList(){
      //头节点,不存储数据。只是指向下一个节点的位置
      //默认为空字符串,和0
       Node head=new Node(" ",0);
}
  1. 链表添加新节点方法(默认添加到链表尾部)
//参数要添加的节点
public void add1(Node newNode){
//需要一个临时节点保存头节来遍历链表,没有临时节点无法遍历
//因为遍历的过程中要不断对节点进行赋值
      Node temp=head;
//     当循环到null时表示到链表尾部,结束循环
     while(temp!=null){
        //下一个节点的位置进行赋值
        temp=temp.next;
     }
//将新节点插入链表尾部
     temp=newNode;
}
  1. 链表删除节点方法
//方法参数传入要删除节点   学号即ID
public void dele(int id){
//创建临时变量遍历链表
      Node temp=head;
//判断链表是否为空
      if(temp.next==null){
       //结果为真则结束方法
        return;
      }
// 遍历链表
      while(temp!=null){
 //判断是否是要删除的  下一个节点
 //要删除节点, 即且断节点。不能找到当前的节点,因为当前节点只是记录下一个节点的位置
//所以要找到要删除节点的上一个节点,把下一个节点的位置修改成下下个节点的位置
              if(temp.next.id==id){
                  return;
              }
      }
//删除节点操作
      temp.next=temp.next.next;
}
  1. 链表查询
//传入要查询  学生 名字  返回该学生的节点
public Node  looking (String name){
//遍历链表
          Node temp=head.next;
//判断链表是否为空
          if(temp.next==null){
              return null;
          }
          while(temp!=null){
//判断当前节点是否是要查询的节点,是反回节点
                     if(temp.name.equals(name)){
                        return temp;
                      }
                       //下一个节点
                       temp=temp.next;
          }
          return null;
}
  1. 链表节点的修改
//传入要修改的 新节点  修改名字
public void revise(Node reNode){
      temp=head.next;
      //判断队列是否为空
      if(temp==null){
        return;
      }
    //遍历链表
      while(temp!=null){
          //判断是否是要修改的节点
          if(temp.id==reNode.id){
                temp.name=reNode.name;
                return;
          }
      }
}
  1. 单向链表根据学号大小进行添加 (从小到大)
public void add2(Node newNode){
       //遍历链表
      temp=head.next;
      while(temp.next!=null){
/*temp的下一个节点与新节点 的id进行比较,如果temp下一个节点 小于新节点
则表示插入temp后面,最后为null则加入链表尾部*/
        if(temp.next.id>id){
          break;
        }
        temp=temp.next;
      }
//新节点记录下一个节点的地址(比这个新加入节点大的id)
            newNode.next=temp.next;
//在temp后插入入新节点
            temp.next=newNode        
}

总结:
在单向链表中添加删除时,遍历链表时不能直接遍历要添加的位置或要删除的位置,因为单向链表,当前节点只能找到后面的节点不能往前找。所以要删除或添加时要找到要添加或删除的前一个节点。然后进行添加删除操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值