//记录链表的长度
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;
//因为是从头结点开始的,所以下面循环会找到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;
}
//方法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接口,重写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;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
、OPPO等大厂,18年进入阿里一直到现在。**
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-EIAsi7Et-1715792680816)]
[外链图片转存中…(img-7a4V2vUO-1715792680816)]
[外链图片转存中…(img-ZsPJlVe2-1715792680817)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!