单向链表

吃猫的鱼
2023-03-03 / 0 评论 / 219 阅读 / 正在检测是否收录...

链表

什么是链表

链表是一种物理存储单元上非连续性,非顺序的存储结构,其物理结构不能直观的表示数据元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结点(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成。

单向链表图例

结点API设计:

表名Node
构造方法Node(T t,Node next):创建Node对象
成员变量T item:存储数据
Node next:指向下一个结点
单向链表API设计
表名LinkList
构造方法LinkList():创建LinkList对象
成员方法1. public void clear(): 空置线性表
2.public boolean isEmpty():判断线性表是否为空,是返回true,否返回false
3.public int length():获取线性表中元素的个数
4.public T get(int i):读取并返回线性表中的i个元素的值
5.public void insert(T t):往线性表中添加一个元素
6.public void insert(int i,T t):在线性表的第i个元素之前插入一个值为t的数据元素
7.public T remove(int i):删除并返回线性表中第i个数据元素
8.public int indexOf(T t):返回线性表中首次出现的指定的数据元素的位序号,若不存在,则返回-1
成员内部类private class Node:结点类
成员变量1.private Node head:记录首结点
2.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(){
        this.head.next = null;
    }

    /**
     * 判断线性表是否为空
     */
    public boolean ifEmpty(){
        return this.head.next==null;
    }

    /**
     * 获取线性表中元素的个数
     */
    public int length(){
        return N;
    }

    /**
     * 读取并返回线性表中第i个元素
     */
    public T get(int i){
        Node n = head.next;
        for(int index=0;index<i;index++){
            n=n.next;
        }
        return n.item;
    }

    /**
     * 往线性表中添加一个元素
     */
    public void insert(T t){
        Node n=head;
        while(n.next!=null){
            n=n.next;
        }
        Node insertT = new Node(t,null);
        n.next = insertT;
        N++;
    }

    /**
     * 在链表第i个元素前面添加一个元素
     */
    public void insert(int i,T t){
        Node n=head;
        //首先找到第i个位置
        for(int j=0;j<i-1;j++){
            n=n.next;
        }
        //找到i位置的结点
        Node curr = n.next;
        //创建新的结点
        Node insertT = new Node(t,curr);
        n.next = insertT;
        N++;
    }
    /**
     * 删除并返回线性表中第i个元素
     */
    public Node remove(int i){
        Node n=head;
        //首先找到第i个元素的前面一个元素
        for(int j=0;j<i-1;j++){
             n=n.next;
        }
        Node deleteData = n.next;
        //找到即将要删除的元素
        Node nextData = deleteData.next;
        //将i前面的元素的下一个结点改变成删除元素的下一个结点。
        n.next = nextData;
        return deleteData;
    }

    /**
     * 返回顺序表中首次出现的指定数据元素的位序号,若不存在则返回-1
     */
    public int indexOf(T t){
        Node n = head;
        //首先遍历整个顺序表,查看是否有哪个元素是匹配的
        for(int j=0;n.next!=null;j++){
            n=n.next;
            if(n.item.equals(t)){
                return j;
            }
        }
        return -1;
    }
    @Override
    public Iterator<T> iterator() {
        return null;
    }

    public class LIterator implements Iterator{
        private Node n;
        public LIterator(){
            this.n= head;
        }
        public boolean hasNext(){
            return n.next!=null;
        }

        public Object next(){
            n=n.next;
            return n.item;
        }
    }
}

2

评论 (0)

取消
友情链接 文章阅读: 网站地图