🟡前言
21天挑战赛的第二周,本文主要讲述有关单链表的知识点
活动地址:CSDN21天学习挑战赛
🟡概述
1️⃣定义
单向链表是链表的一种,它由多个结点组成,每个结点都由一个数据域和一个指针域组成,数据域用来存储数据,指针域用来指向其后继结点。链表的头结点的数据域不存储数据,指针域指向第一个真正存储数据的结点。
2️⃣示意图
🟡API设计
1️⃣构造方法
LinkList()
:创建LinkList对象
2️⃣成员方法
- public void clear():将一个线性表置为空表
- public boolean isEmpty():判断当前线性表是否为空表
- public int length():获取线性表的长度
- public T get(int i):获取当前索引对应元素
- public void insert(int i, T t):向线性表中索引值为i处前添加元素t
- public void insert(T t):向线性表中添加元素t
- public T remove(int i):删除i处元素值,并返回该元素
- public int indexOf(T t) :查找t元素第一次出现位置
3️⃣成员内部类
private class Node
4️⃣成员变量
private Node head
:记录头节点private int N
:记录链表长度
🟡代码实现
public class LinkList<T> implements Iterable<T>{ //记录头结点 private Node head; //记录链表的长度 private int N; //结点类 private class Node { //存储数据 T item; //下一个结点 Node next; public Node(T item, Node next) { this.item = item; this.next = next; } } public LinkList() { //初始化头结点、 this.head = new Node(null,null); //初始化元素个数 this.N=0; } //清空链表 public void clear() { head.next=null; this.N=0; } //获取链表的长度 public int length() { return N; } //判断链表是否为空 public boolean isEmpty() { return N==0; } //获取指定位置i出的元素 public T get(int i) { //通过循环,从头结点开始往后找,依次找i次,就可以找到对应的元素 Node n = head.next; for(int index=0;index<i;index++){ n=n.next; } return n.item; } //向链表中添加元素t public void insert(T t) { //找到当前最后一个结点 Node n = head; while(n.next!=null){ n=n.next; } //创建新结点,保存元素t Node newNode = new Node(t, null); //让当前最后一个结点指向新结点 n.next=newNode; //元素的个数+1 N++; } //向指定位置i出,添加元素t public void insert(int i, T t) { //找到i位置前一个结点 Node pre = head; for(int index=0;index<=i-1;index++){ pre=pre.next; } //找到i位置的结点 Node curr = pre.next; //创建新结点,并且新结点需要指向原来i位置的结点 Node newNode = new Node(t, curr); //原来i位置的前一个节点指向新结点即可 pre.next=newNode; //元素的个数+1 N++; } //删除指定位置i处的元素,并返回被删除的元素 public T remove(int i) { //找到i位置的前一个节点 Node pre = head; for(int index=0;index<=i-1;i++){ pre=pre.next; } //要找到i位置的结点 Node curr = pre.next; //找到i位置的下一个结点 Node nextNode = curr.next; //前一个结点指向下一个结点 pre.next=nextNode; //元素个数-1 N--; return curr.item; } //查找元素t在链表中第一次出现的位置 public int indexOf(T t) { //从头结点开始,依次找到每一个结点,取出item,和t比较,如果相同,就找到了 Node n = head; for(int i=0;n.next!=null;i++){ n=n.next; if (n.item.equals(t)){ return i; } } return -1; } @Override public Iterator<T> iterator() { return new LIterator(); } private class LIterator implements Iterator{ 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; } }
🟡测试代码
public class LinkListTest { public static void main(String[] args)throws Exception { LinkList<String> list = new LinkList<>(); list.insert(0,"张三"); list.insert(1,"李四"); list.insert(2,"老六"); list.insert(3,"老八"); //获取表长度 System.out.println(list.length()); //测试获取 list.insert(1,"老六"); String getResult = list.get(1); System.out.println("索引1处的结果为:" + getResult); //测试删除 String removeResult = list.remove(2); System.out.println("删除的元素是:" + removeResult); } }
🟡结语
本文对单链表进行简单实现,接下来会对单链表进行反转