数据结构-单链表

  • 定义

    • 单链表是一种线性数据结构,其中每个元素都是一个独立的对象。每个元素(或称为节点)都包含两个项:数据和指向下一个节点的引用(或称为指针)。最后一个节点的指针通常指向null,表示链表的末尾。
  • 底层实现

    • 节点
      public class Node {
          int data;
          Node next;
          public Node(int data, Node next) {
              this.data = data;
              this.next = next;
          }
      }
      
    • 单链表实现
      public class SingleLinkedList {
          //头指针
          Node head;
          //创建头节点(data域表示元素个数)
          public SingleLinkedList() {
              this.head = new Node(0,null);
          }
          //1.添加元素到链表末尾
          public void append(int data){
              Node newNode = new Node(data, null);
              //临时指针
              Node currentNode = head;
              while (currentNode.next != null){
                  currentNode=currentNode.next;
              }
              currentNode.next=newNode;
              head.data++;
          }
          //2.在链表头部添加元素
          public void addFirst(int data){
              Node newNode = new Node(data, null);
              newNode.next=head.next;
              head.next=newNode;
              head.data++;
          }
          //3.删除链表中第一个等于给定值的元素
          public void remove(int data){
              Node currentNode = head;
              while (currentNode.next != null){
                  if (currentNode.next.data == data){
                      currentNode.next=currentNode.next.next;
                      head.data--;
                      return;
                  }
                  currentNode=currentNode.next;
              }
          }
          //4.打印链表
          public void print(){
      
              Node currentNode = head.next;
              while (currentNode != null){
                  System.out.print(currentNode.data+" ");
                  currentNode=currentNode.next;
              }
              System.out.println("null");
          }
      }
      
  • Java中的linkedlist类实现单链表

    • 单链表实现
      public class LinkListJavaDemo {
          private LinkedList<Integer> list;
          //创建单链表
          public LinkListJavaDemo() {
              list = new LinkedList<>();
          }
          //1.添加到头部
          public void addFirst(int data){
              list.addFirst(data);
          }
          //2.添加到尾部
          public void addLast(int data){
              list.addLast(data);
          }
          //3.获取元素数量
          public int size(){
              return list.size();
          }
          //4.删除元素中第一个符合给定值的元素
          public void removeFirst(int data){
              list.removeFirstOccurrence(data);
          }
          //5.打印链表
          public void printLinkList(){
              for (int data:list){
                  System.out.print(data+"->");
              }
              System.out.println("null");
          }
      
      }
      
  • 带头节点和不带头节点的利弊

    • 带头结点的单链表:

    优点:便于实现“插入”操作。在带头结点的单链表中,插入操作不需要判断当前链表是否为空,直接将新结点插入到头结点之后即可。
    缺点:增加了一个额外的结点,占用一定的存储空间。
    初始化链表时需要单独处理头结点,增加了一定的复杂度。
    不带头结点的单链表:

    优点:不占用额外的存储空间。
    初始化链表时不需要单独处理头结点,代码更简洁。
    缺点:处理空链表时容易引发异常。在进行链表操作时,如果未检查链表是否为空,直接访问头结点可能会导致空指针异常。
    实现“插入”操作时需要判断链表是否为空,增加了一定的复杂度。
    总结:在实际应用中,可以根据具体需求和场景选择合适的实现方式。如果需要频繁地进行插入操作,或者需要处理空链表,带头结点的单链表可能是更好的选择。如果不希望占用额外的存储空间,或者需要简化代码,不带头结点的单链表也是一个不错的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Iron_Sp-man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值