首页 > 其他分享 >链表

链表

时间:2023-04-14 09:12:56浏览次数:36  
标签:temp no System next 链表 节点

概述

  • 链表是一种通过指针串联在一起的线性结构
  • 链表在内存中的存储形式
    • 链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上
  • 链表有节点组成,每个节点又分成两个部分:1)数据域 (data) 2)指针域
    • 数据域:存放数据
    • 指针域:存放指针,指向节点
  • 头节点(head)
    • 链表需要创建一个头节点来指定头,该节点数据域为null,指针初始化为null
    • 当第一个节点加入时,将头节点的指针指向第一个节点
    • 头节点只具有指向作用
  • 链表又分为
    • 单链表
    • 双链表
    • 循环链表

链表.png

单链表

  • 只有一个指针域,指向下一个节点 ,称为next
  • 最后一个节点的指针指向null

单链表.png

/**
 * @author 发着呆看星
 * @create 2023/3/29
 **/
public class Node<E> {
    // 节点id
    private int no;
    // 数据域
    private E data;
    // 指针域,指向下一个节点
    public Node<E> next;

    public Node(int no, E data) {
        this.no = no;
        this.data = data;
    }

    public Node() {
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public E getData() {
        return data;
    }

    public void setData(E data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", data=" + data +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Node<?> node = (Node<?>) o;
        return no == node.no;
    }

    @Override
    public int hashCode() {
        return Objects.hash(no);
    }
}

/**
 * @author 发着呆看星
 * @create 2023/3/29
 **/
public class SingleLinkedList<E> {
    // 创建头节点 ,只具有指向功能
    /*
	 也可以没有 ,加入的第一个节点即为头节点
      private Node<E> head = null;   加入第一个时判断 ,head = 第一个节点
	*/
   
    private Node<E> head = new Node<>();

    // 去重添加节点操作,添加至链表末尾
    public void addNode(Node<E> node) {
        Node<E> temp;
        if (head.next == null) {
            head.next = node;
            return;
        }
        if (head.next.equals(node)) {
            System.out.println("链表中已存在该元素");
            return;
        } else {
            temp = head.next;
        }
        while (true) {
            if (temp.equals(node)){
                System.out.println("链表中已存在该元素");
                return;
            }
            if (temp.next == null) {
                temp.next = node;
                break;
            }
            temp = temp.next;
        }
    }

    // 遍历链表
    public void showLinkedList() {
        if (head.next == null) {
            System.out.println("当前链表为空");
            return;
        }
        Node<E> temp = head.next;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }

    // 删除指定节点
    // 单链表删除节点应该找到要删除节点的前一个节点
    public void delete(int no){
        if (head.next == null){
            System.out.println("当前链表没有元素,不能进行删除操作");
            return;
        }
        Node<E> temp =  head;
        while (temp.next != null){
            if (temp.next.getNo() == no) {
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }
        System.out.println("链表中没有你想要删除的元素");
    }

    // 修改节点
    public void update(Node<E> node){
        if (head.next == null){
            System.out.println("当前链表没有元素,不能进行修改操作");
            return;
        }
        Node<E> temp = head.next;
        while (temp != null){
            if (temp.getNo() == node.getNo()){
                temp.setData(node.getData());
                return;
            }
            temp = temp.next;
        }
        System.out.println("当前链表没有你想要修改的节点");
    }
}

public static void main(String[] args) {
    SingleLinkedList<String> sll = new SingleLinkedList<>();
    boolean loop = true;
    Scanner scanner = new Scanner(System.in);
    int no;
    while (loop){
        System.out.println("==================================");
        System.out.println("(a):添加节点");
        System.out.println("(u):修改节点");
        System.out.println("(r):删除指定节点");
        System.out.println("(l):查看链表");
        System.out.println("(e):退出程序");
        System.out.print("请选择你要的操作:");
        char c = scanner.next().charAt(0);
        switch (c){
            case 'a':
            case 'u':
                System.out.print("请输入节点的编号:");
                no = scanner.nextInt();
                System.out.print("请输入节点的数据:");
                String data = scanner.next();
                Node<String> stringNode = new Node<>(no,data);
                sll.addNode(stringNode);
                break;
            case 'r':
                System.out.print("请输入想要删除节点的编号:");
                no = scanner.nextInt();
                sll.delete(no);
                break;
            case 'l':
                sll.showLinkedList();
                break;
            case 'e':
                loop = false;
                break;
        }
        System.out.println();
    }
}

双链表

  • 双链表有两个指针域,一个指向上一个节点 ,一个指向下一个节点
  • 第一个节点指向上一个节点的指针域为null
  • 最后一个节指向下一个节点的指针域为null

双链表.png

循环链表

  • 循环链表:即首位相连的链表
  • 和普通链表不同的是,循环链表的最后一个节点的 next 指向 第一个节点

循环链表.png

标签:temp,no,System,next,链表,节点
From: https://www.cnblogs.com/fzdkx/p/17317222.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:两两交换链表中的节点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]代码实现:classSolution{publicListN......
  • 链表应用 II
    目录链表应用II应用2:Leetcode.25题目分析代码实现链表应用II应用2:Leetcode.25题目25.K个一组翻转链表输入:\(head=[1,2,3,4,5]\),\(k=2\)输出:\([2,1,4,3,5]\)分析这里,我们以前面题目中的用例,来说明算法的步骤。为了避免讨论边界条件,这里,我们使用一个\(dummy\)......
  • 两个链表相交问题
    给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交: 题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。题目链接链表相交classSolutio......
  • 四种语言刷算法之相交链表
    力扣160. 相交链表1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*getIntersectionNode(structListNode*headA,structListNode*headB){if(headA==NULL||headB==NU......
  • 约瑟夫环问题---&解题方法 静态单链表&一维数组
      importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);intn=input.nextInt();intm=input.nextInt();int[]ant=newint[150];for(int......
  • 数组和链表的区别
    1.读取数组读取耗时为O(1),支持随机读取;链表读取耗时为O(n),仅支持顺序读取; 2.插入(已知目标节点)数组插入耗时为O(n);链表插入耗时为O(1); 3.删除(同插入)数组插入耗时为O(n);链表插入耗时为O(1);  ......
  • 1019. 链表中的下一个更大节点
    1019.链表中的下一个更大节点给定一个长度为 n 的链表 head对于列表中的每个节点,查找下一个更大节点的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值严格大于它的值。返回一个整数数组answer,其中answer[i]是第i个节点(从1开始)的下一个......
  • 203. 移除链表元素
    参考链接:代码随想录题目描述:解题思路:由单链表的特殊性,如果删除的是头节点应该怎么操作呢?这里就涉及如下链表操作的两种方式:-直接使用原来的链表进行删除操作-设置一个虚拟头节点进行删除操作第一种操作: 移除头节点和移除其他节点的操作是不一样的,因为链表的其他节点......
  • #yyds干货盘点# LeetCode程序员面试金典:合并两个有序链表
    题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]代码实现:classSolution{publicLis......
  • 线性表之单链表
    定义初始化单链表尾插法建立单链表--正向建立单链表头插法建立单链表单链表的查找按位查找,返回第i个元素(带头结点)按值查找,找到元素值为x的点......