链表是由一系列的结点构成的,链表的第一个元素为头结点,头结点的特点是;不存放具体的数
表示单链表的表头,比如要找一个结点就是从头结点一个一个往下找的。
每一个结点有一个类似于指针的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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
资料过多,篇幅有限,需要文中全部资料可以点击这里获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。
图片转存中…(img-KbacOfQQ-1713001201274)]
[外链图片转存中…(img-dAJd7Spt-1713001201275)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-c3TKIN7G-1713001201275)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
[外链图片转存中…(img-2Jy1SZ3E-1713001201276)]
[外链图片转存中…(img-FDJAzV6L-1713001201276)]
资料过多,篇幅有限,需要文中全部资料可以点击这里获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。