话说傲娇的链表文艺青年

2023-12-29 09:50
文章标签 链表 文艺 傲娇 青年

本文主要是介绍话说傲娇的链表文艺青年,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                                  话说傲娇的链表文艺青年 

     昨天花了一下午的时间写我的链表,写的有点晕,下面来总结一下链表的小知识点:

一:链表VS顺序表

     线性表的存储有两种方式:顺序存储和链式存储。顺序存储相当于数组的存储,在开辟的存储空间中有顺序地存储元素,这一特点使我们可以随机存取表中的任一结点,但它也使得插入和删除操作会移动大量的结点.,为避免大量结点的移动,我们采用线性表的另一种存储方式:链式存储结构,简称为链表。

  顺序存储类似于一种静态的存储,顺序表中存储的一样结构的东西。一切都是板上钉钉的事,我只需要知道顺序表存储的首地址我就可以知道整个顺序表中的任何一个元素的存储地址。所以说顺序存储好像一个贤惠的妻子,中规中矩,一些都是井井有条的;它也好似人类的群居现象,物以类聚,人以群分,群中的人紧紧联系,不可分离。

  链式存储相当于一种动态存储,每一条链表好像小女孩手中的一串玛瑙项链,我们是用线串在一起的,你是我的前面一粒珠子,他是我的后面一串珠子,一旦某一个线断了,我就在也找不到我后面的珠子去哪里了,但是只要给我一根连接的线,我又能自由地组合成一串美丽的玛瑙项链。所以,链表是一个追求自由的,随性的文艺青年,享受孤独又容易相处!

  那么到底选用哪一种存储方式呢?这个就要具体问题具体分析了!

  就效率来说:

  顺序存储:加元素, 删除元素的效率低;修改元素,获取元素的效率高。

    链式存储:添加元素,删除元素效率高;修改元素,获取元素效率低。

 

二:实现链表的思路:

1.节点类:属性有:数据(元素),下一个节点

2.定义一个接口:定义链表的功能:增删改查,取得链表的长度,在某一个位置插入一个元素,判断链表是否存在等

3.实现接口的类:链表类

     属性:头节点,尾节点,链表的长度

    方法:继承接口,实现接口的所有方法

4.注意:用泛型实现链表更加方便

 三:链表的实现:

链表的实现要注意的其实只有两点:一是节点的插入,一是节点的删除。

节点的插入:

 

 

 节点的删除:

 

 

 

 示例代码:

1.节点类:

public class Node<E> {//数据(元素)private E data;//下一个节点private Node<E> next;//链表的长度private int size;public Node(){}public Node(E e){this.data=e;}public E getData() {return data;}public void setData(E data) {this.data = data;}public Node<E> getNext() {return next;}public void setNext(Node<E> next) {this.next = next;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}}

2.接口类:

public interface MyList<E> {//向链表中加入一个对象public void add(E e);//取得链表中指定位置的一个对象public E get(int index);//取得链表的长度public int size();//删除一个对象public void delete(E data);//修改一个对象public void change(E e,int index);//在某一个位置插入一个元素public void insert(E e,int index);//判断链表是否存在public Boolean isexit();}

3.链表类:

public class SList<E> implements MyList<E> {// 链表的属性private Node<E> head;// 头节点private Node<E> tail;// 尾节点private static  int size;//链表的长度public int getSize() {return size;}public void setSize(int size) {SList.size = size;}private static SList<String> st;Node<E> newNode;public static void main(String[] args) {st = new SList<>();         st.add("i walk like");st.add("a worm");st.add("but");st.add("i never give up");st.add("!");System.out.println("判断链表是否存在:");st.isexit();System.out.println("添加了"+st.getSize()+"个节点:");printList();System.out.println("将第三个元素改为however");st.change("however",3);printList();System.out.println("将i never give up删除");st.delete("i never give up");printList();System.out.println("在第二个节点后面插入一个元素:");st.insert("My favorite words!", 3);printList();System.out.println("当前链表的长度是:"+st.size());}//打印链表public static void printList(){for (int i = 0; i <st.getSize(); i++) {System.out.println(st.get(i));}}// 链表的方法
    @Overridepublic void add(E e) {/** 分情况考虑: 1.这是个空队列 2.已经有了头节点*///新建一个节点Node<E> newNode = new Node<E>(e);//1:分情况考虑    添加第一个元素,和第一个元素已经存在的情况if(size > 0){//将尾节点的下一个节点变为新节点
                    tail.setNext(newNode);}else{//创建头结点head = new Node<E>();//头结点的下一个节点为新节点
                    head.setNext(newNode);}//把新节点变为尾节点tail = newNode;//个数+1size++;                }// 获取一个元素
    @Overridepublic E get(int index){//定义节点为第一个节点Node<E> node = head.getNext();for(int i=0; i<index; i++){//将节点变为下一个节点node = node.getNext();}return node.getData();    }@Overridepublic int size() {return SList.size;}// 删除一个元素
    @Overridepublic void delete(E data){   //删除某一节点    Node<E> curr=head.getNext(),prev=null;    boolean b=false;    while(curr!=null){    if(curr.getData().equals(data)){    //判断是什么节点    if(curr==head){   //如果删除的是头节点     head=curr.getNext();    b=true; size=size-1;return;    }    if(curr==tail){ //如果删除的是尾节点    tail=prev;    prev.setNext(null);    b=true; size=size-1;return;    }    else{  //  如果删除的是中间节点(即非头节点或非尾节点)       
                    prev.setNext(curr.getNext());    b=true; size=size-1;return;    }}    prev=curr;    curr=curr.getNext();     }    if(b==false){    System.out.println('\n'+"没有这个数据");    }}    // 修改一个元素
    @Overridepublic void change(E e,int index) {//定义节点为第一个节点Node<E> node = head.getNext();for(int i=0; i<index;i++){             if(i==index-1){node.setData(e);}else{//将节点变为下一个节点node = node.getNext();}}}//在某一个指定的位置插入一个节点
    @Overridepublic void insert(E e, int index) {//定义节点为第一个节点Node<E> node = head.getNext();for(int i=0; i<index; i++){if(i==index-1){//找到了要插入的节点位置Node<E> inNode=new Node<E>(e);inNode.setData(e);inNode.setNext(node.getNext());node.setNext(inNode);size++;}else//将节点变为下一个节点node = node.getNext();}}//判断链表是否存在
    @Overridepublic Boolean isexit() {if(st.getSize()>0){System.out.println("链表存在!");return true;}else{System.out.println("链表不存在!");return false;}}
}

效果展示:

 

 

 

 

 

 

 

 

 

 

 

 

 

练习:

转载于:https://www.cnblogs.com/java-7/p/6259873.html

这篇关于话说傲娇的链表文艺青年的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549142

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

c++ 链表详细介绍

链表是数据结构的一种,由节点组成,每个节点包含数据和指向下一个节点的指针。链表在C++中的实现可以是单链表、双链表或循环链表。以下是链表的详细介绍: 1. 单链表 结构: 节点(Node):每个节点包含数据和一个指针(next),指向链表中的下一个节点。 示例结构: struct Node {int data;Node* next;Node(int d) : data(d), next(

带头结点的线性链表的基本操作

持续了好久,终于有了这篇博客,链表的操作需要借助图像模型进行反复学习,这里尽可能的整理并记录下自己的思考,以备后面复习,和大家分享。需要说明的是,我们从实际应用角度出发重新定义了线性表。 一. 定义 从上一篇文章可以看到,由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在某些实现的缺点,如求线性表的长度时不如顺序存储结构的

数据结构基础(栈,队列,数组,链表,树)

栈:后进先出,先进后出 队列:先进先出,后进后出 数组:查询速度快,通过地址值和索引定位,查询任意数据消耗时长相同,在内存中是连续存储的,删除效率低,要将原始数据删除,然后后面的数据前移,添加效率低,添加索引位置的元素,剩下的都需要向前后移动 链表:节点的存储位置(地址)里面存储本身的数据值,和下一个节点的地址值,链表中的节点是独立对象,在内存中是不连续的。查询速度慢,无论查询哪个数据都要从

(六十四)第 10 章 内部排序(静态链表的插入排序)

示例代码 staticLinkList.h // 静态链表的插入排序实现头文件#ifndef STATIC_LINK_LIST_H#define STATIC_LINK_LIST_H#include "errorRecord.h"#define SIZE 100#define NUM 8typedef int InfoType;typedef int KeyType;ty