【数据结构和算法】第七锻造,链表真身(1)

链表是由一系列的结点构成的,链表的第一个元素为头结点,头结点的特点是;不存放具体的数

表示单链表的表头,比如要找一个结点就是从头结点一个一个往下找的。

每一个结点有一个类似于指针的next,用来指向下一个结点,和一个date区域用于存储数据

头结点不存放数据,最后一个结点不指向null。

三、单向链表的API设置

============

代码实现


结点类:链表的设置结点类少不了

//定义节点类(成员内部类)

private class Node{

//存储数据

T item;

//下一个节点

Node next;

public Node(T item,Node next){

this.item=item;

this.next=next;

}

}

成员变量和构造方法

//记录头节点

private Node head;

//记录链表的长度

private int N;

//构造方法用来初始化成员变量

public LinkList(){

this.head=new Node(null,null);

this.N=0;

}

清空链表,链表的长度,链表是否为空

//方法1:清空链表

public void clear(){

head.next=null;//将头结点的指向置空

this.N=0;//元素个数变为0

}

//方法2:链表的长度

public int length(){

return N;//N就是链表长度

}

//方法3:判断链表是否为空

public boolean isEmpty(){

return this.N==0;//只需判断N是否为0即可

}

获取指定位置处的元素

//方法4:获取指定位置处的元素

public T get(int i){

Node node=head.next;//node是下一个结点

if(node!=null){//有下一个结点

for(int index=0;index<i;index++){

node=node.next;//往下一个结点移动

}

return node.item;

}

return null;

}

插入元素t(在链表的最后以结点后插入元素)

//方法5:插入元素t(在链表的最后以结点后插入元素)

public void insert(T t){

//创建一个结点

Node node=head;

while(node.next!=null){//找到最后一个结点的前一个结点

node=node.next;

}

Node newLast=new Node(t, null);

//之前的最后指向现在的最后结点

node.next=newLast;

//元素个数加一

N++;

}

在指定i处,添加元素t

//方法6:在指定i处,添加元素t

public void insert(int i,T t){

//创建一个结点,从头结点开始

Node node =head;

for(int index=0;index<i;index++){//找到i位置处的前一个元素

node=node.next;

}

//当前i位置的结点

Node oldNode=node.next;

//创建结点t

Node newNode=new Node(t, null);

//此时node表示的还是前一个结点,所以只需要把前一个结点指向创建的新结点

node.next=newNode;

//新结点指向原来i位置处的结点,即可完成连接

newNode.next=oldNode;

//元素个数加一

N++;

}

删除指定位置i处的元素并返回被删除的元素

//方法7:删除指定位置i处的元素并返回被删除的元素

public T remove(int i) {

//创建一个结点,从头节点开始

Node node=head;

//因为是从头结点开始的,所以下面循环会找到i位置的前一个结点

for(int index=0;index<i;index++){

node=node.next;

}

//i位置处的结点

Node iNode=node.next;

//直接让i位置处的前以结点指向i位置的后一结点就可以删除i位置处的结点

node.next=iNode.next;//或者也可以node.next=node.next.next;

//元素减1

N–;

return iNode.item;

}

查找元素t在链表中第一次出现的位置

//方法8:查找元素t在链表中第一次出现的位置

public int indexOf(T t){

Node node=head;

for(int index=0;node.next!=null;index++){

node=node.next;

if(node.item.equals(t)){

return index;

}

}

//找不到

return -1;

}

提供一个遍历的方法,实现Iterable接口

public class LinkList implements Iterable{}

//实现Iterable接口,重写iterator方法

@Override

//因为要的接口对象(接口不能直接new),所以我们必须创建一个对象去实现这个接口

public Iterator iterator() {

return new LIterator() ;

}

public class LIterator implements Iterator{

//实现Iterator接口重写hasNext()和next()两个方法

private Node n;

public LIterator(){

this.n=head;//从头结点开始

}

@Override

public boolean hasNext() {//是否有元素

return n.next!=null;

}

@Override

public Object next() {//返回下一个元素

n=n.next;

return n.item;

}

}

全部代码概览:


import java.util.Iterator;

public class LinkList implements Iterable{

//定义节点类

private class Node{

//存储数据

T item;

//下一个节点

Node next;

public Node(T item,Node next){

this.item=item;

this.next=next;

}

}

//记录头节点

private Node head;

//记录链表的长度

private int N;

//构造方法用来初始化成员变量

public LinkList(){

this.head=new Node(null,null);

this.N=0;

}

//方法1:清空链表

public void clear(){

head.next=null;//将头结点的指向置空

this.N=0;//元素个数变为0

}

//方法2:链表的长度

public int length(){

return N;//N就是链表长度

}

//方法3:判断链表是否为空

public boolean isEmpty(){

return this.N==0;//只需判断N是否为0即可

}

//方法4:获取指定位置处的元素

public T get(int i){

Node node=head.next;//node是下一个结点

if(node!=null){//有下一个结点

for(int index=0;index<i;index++){

node=node.next;//往下一个结点移动

}

return node.item;

}

return null;

}

//方法5:插入元素t(在链表的最后以结点后插入元素)

public void insert(T t){

//创建一个结点

Node node=head;

while(node.next!=null){//找到最后一个结点的前一个结点

node=node.next;

}

Node newLast=new Node(t, null);

//之前的最后指向现在的最后结点

node.next=newLast;

//元素个数加一

N++;

}

//方法6:在指定i处,添加元素t

public void insert(int i,T t){

//创建一个结点,从头结点开始

Node node =head;

for(int index=0;index<i;index++){//找到i位置处的前一个元素

node=node.next;

}

//当前i位置的结点

Node oldNode=node.next;

//创建结点t

Node newNode=new Node(t, null);

//此时node表示的还是前一个结点,所以只需要把前一个结点指向创建的新结点

node.next=newNode;

//新结点指向原来i位置处的结点,即可完成连接

newNode.next=oldNode;

//元素个数加一

N++;

}

//方法7:删除指定位置i处的元素并返回被删除的元素

public T remove(int i) {

//创建一个结点,从头节点开始

Node node=head;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里获取前端学习资料

FW7jXri-1712561350564)]

[外链图片转存中…(img-fUzJmwAZ-1712561350564)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-PHNP8DYP-1712561350565)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里获取前端学习资料

前端学习书籍导图-1

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值