每天一道算法题——链表基础

链表的定义

链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。

链表的特点

  • 不需要连续的内存空间
  • 有指针引用

三种最常见的链表结构

最常见的链表结构有单链表、双向链表和循环链表,我们这里只介绍单向链表。

单链表

数据结构逻辑图

单向链表(单链表)是链表的一种,其特点是链表的连接方向是单向的,对链表的访问要从头部开始顺序读取。

定义链表节点

逻辑梳理

结点除了在·下一个结点的地址

代码实现
public class ListNode{

   /**
    * 值
    */
   int value;    
   /**
    * 下一个的指针
    */
   ListNode next;

   ListNode(int value){
      this.value = value;
      this.next = null;
   }
}

定义链表属性值

逻辑梳理
  1. 我们的单向链表只需要最简单的2个元素,头和大小即可
代码实现
public class MyLinkedList {

   /**
    * 头
    */
   private ListNode head;
   /**
    * 大小
    */
   private int size = 0;
}

定义头部插入方法

逻辑梳理
  1. 初始新化节点
  2. 新节点的下一个节点的地址 赋值为 原本head的地址
  3. 新的节点成为head
代码实现
/**
 * 插入头
 *
 * @param data 数据
 */
public void insertHead(int data){
   // 初始新化节点
   ListNode newNode = new ListNode(data);
   // 新节点的下一个节点的地址 赋值为 原本head的地址
   newNode.next = head;
   // 新的节点成为head
   head = newNode;
}

定义指定位置插入方法

逻辑梳理
  1. 获取当前指定位置的节点

  2. 保证不断链

    (1)新加的点指向后

    (2)把当前的点指向新加的点

代码实现
/**
 * 插入指定位置
 *
 * @param data     数据
 * @param position 位置
 */
public void insertNth(int data,int position){
   // 这个表示插入在头部了
   if(position == 0) {
      insertHead(data);
   }else{
      ListNode cur = head;
      for(int i = 1; i < position ; i++){
         //一直往后遍历,是为了获取当前节点
         cur = cur.next;       
      }
      ListNode newNode = new ListNode(data);
      // 以下2步,保证不断链
      // 1、新加的点指向后面
      newNode.next = cur.next;
      // 2、把当前的点指向新加的点
      cur.next = newNode;
   }
}

定义删除头方法

逻辑梳理

把head的点指向head的下一个点

代码实现
/**
 * 删除头
 */
public void deleteHead(){
   // 把head的点指向head的下一个点
   head = head.next;
}

定义指定位置删除方法

逻辑梳理
  1. 获取当前指定位置的节点

  2. 保证不断链

    (1)删除的点的指向,指向在下一个点,即cur.next = cur.next.next

代码实现
/**
 * 删除指定位置
 *
 * @param position 位置
 */
public void deleteNth(int position){//O(n)
   if(position == 0) {
      deleteHead();
   }else{
      ListNode cur = head;
      for(int i = 1; i < position ; i ++){
         // 一直往后遍历,是为了获取当前节点
         cur = cur.next;
      }
       // 删除的点的指向,指向在下一个点
      cur.next = cur.next.next; 
   }
}

定义查找方法

逻辑梳理
  1. 节点不为空则判断传入值与节点值是否相同,相同则退出。不相同则判断下一个节点
代码实现
/**
 * 查找
 *
 * @param data 数据
 */
public void find(int data){
   ListNode cur = head;
   while(cur != null){
      if(cur.value == data) {
         break;
      }
      cur = cur.next;
   }
}
/**
 * 查找
 *
 * @param data 数据
 */
public void find(int data){
   ListNode cur = head;
   while(cur != null){
      if(cur.value == data) {
         break;
      }
      cur = cur.next;
   }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

第七人格

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

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

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

打赏作者

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

抵扣说明:

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

余额充值