一文让你学会手写“单向链表”

连续的加班,赶进度终于告一段落了。

下面开始今天的文章,让我们一起动手code,实现单向链表和对其的一些基本操作。(如果有不太了解链表的可以看这里。)

链表节点类

public class Node {

  // 数据域
  public String data;

  // 指针域(指向下一个节点)
  public Node next;

  /**
   * 构造方法
   */
  public Node(String data) {
    this.data = data;
  }
  
}
复制代码

单向链表(带头节点)的基本代码

public class SingleLinkedList {

  // 头节点
  private Node herd = new Node("HerdNode");

  public Node getHerd() {
    return herd;
  }

  public void setHerd(Node herd) {
    this.herd = herd;
  }
  
}  
复制代码

在链表尾部添加节点

public void addAfter(Node newNode) {
  // 辅助节点
  Node temp = herd;
  while (true) {
    // 找到链表的最后一个节点,结束循环
    if (temp.next == null) {
      break;
    }
    // 将辅助节点后移
    temp = temp.next;
  }
  // 将新节点添加链表尾部
  temp.next = newNode;
}
复制代码

在指定节点内容后插入数据

开始编码前,先看下图,有助于理解代码。

/**
 * 在指定节点内容后插入数据
 * 
 * @param nodeData 指定节点的内容(插入到哪个节点后)
 * @param newNode 新节点
 */
public void insertAfterNode(String nodeData, Node newNode) {
    // 参数校验
    if (nodeData == null) {
      throw new RuntimeException("入参有误!");
    }
    // 辅助节点
    Node temp = herd;
    // 定义标识(表示找到指定节点)
    boolean flag = false;
    while (true) {
      // 到达链表尾部
      if (temp == null) {
        break;
      }
      // 找到指定的节点,结束循环。
      if (nodeData.equals(temp.data)) {
        flag = true;
        break;
      }
      // 将辅助节点后移
      temp = temp.next;
    }
    if (flag) {
      // 新节点跟指定节点的下一个节点连接。
      newNode.next = temp.next;
      // 指定节点跟新节点连接
      temp.next = newNode;
    } else {
      throw new RuntimeException("未找到指定节点无法插入新节点!");
    }
}
复制代码

根据指定节点内容删除节点

开始编码前,先看下图,有助于理解代码。

/**
 * 删除指定节点
 *
 * @param data 指定节点内容(被删除的节点内容)
 */
public void delete(String data) {
    // 参数校验
    if (data == null) {
      throw new RuntimeException("入参有误!");
    }
    // 定义辅助节点
    // 注:该节点需要指向待删除节点的前一个节点
    Node temp = herd;
    // 定义标识(表示找到指定节点)
    boolean flag = false;
    while (true){
      // 到达链表尾
      if(temp.next == null){
        break;
      }
      // 找到指定节点了
      if(data.equals(temp.next.data)){
        flag = true;
        break;
      }
      temp = temp.next;
    }
    if(flag){
      // 删除指定节点
      temp.next = temp.next.next;
    }else {
      throw new RuntimeException("未找到指定节点无法进行删除操作!");
    }
}
复制代码

单链表操作中比较有难度的也就是插入节点和删除节点了,通过上面的代码和图片相信大家对单链表有一个自己的认识了,如果有问题大家可以告诉我。查询和修改方法就不再进行代码演示了。通过上面的代码,相信大家也可以自己写出来。

今天的分享就先到这里了,如果文章哪里有问题希望大家可以指出来。看都看完了,点个赞再走吧!

猜你喜欢

转载自juejin.im/post/5ec8b5e8f265da76d66c1770