单链表的简单实现

实现线性表的另一种常用技术是基于链接结构,用链接关系显式地表现元素之间的顺序关联

采用链接方式实现线性表的基本想法:

  1. 把表中元素分别存入一批独立的存储块(称为表的结点)里;
  2. 在前一结点里用链接的方式显式地记录与下一结点的关联,保证从组成表结构的任一结点都可以找到下一个结点,从而保证能找到表中的下一个元素

单链表结点的结构:

表元素域elem保存着作为一个表元素的数据项,链接域next里保存着同一个表里的下一个结点的链接

单链表结点的实现:

class Node {
    int elem;
    Node next;
    public Node(int elem) {
        this.elem = elem;
    }
}

 常见形式的单链表:

n个结点通过链接形成一条链接链,head变量用于保存表首结点的引用,称为表头变量或者表头指针,表尾结点的链接域置为空(null),用于表示链表的结束 

简单实现一个单链表:

class SingleLinkedList {
    Node head;
    int size;
    public SingleLinkedList() { }
    private void checkRange(int i) {
        if(i<0 || i>=size) {
            throw new IndexOutOfBoundsException("Index:"+i+" Size:"+size);
        }
    }
    public boolean isEmpty() {
        return head==null;
    }
    public void prepend(int elem) {
        Node newNode = new Node(elem);
        size++;
        if(head==null) {
            head = newNode;
            return;
        }
        newNode.next = head;
        head = newNode;
    }
    public void append(int elem) {
        insert(elem, size);
    }
    public void insert(int elem, int i) {
        if(i<0 || i>size) {
            throw new IndexOutOfBoundsException("Index:"+i+" Size:"+size);
        }
        if(i==0) {
            prepend(elem);
            return;
        }
        Node newNode = new Node(elem);
        Node currNode = head;
        while(i!=1) {
            currNode = currNode.next;
            i--;
        }
        newNode.next = currNode.next;
        currNode.next = newNode;
        size++;
    }
    public void deleteFirst() {
        if(head == null) {
            throw new IndexOutOfBoundsException("Index:"+0+" Size:"+0);
        }
        head = head.next;
        size--;
    }
    public void deleteLast() {
        delete(size-1);
    }
    public void delete(int i) {
        checkRange(i);
        if(i==0) {
            deleteFirst();
            return;
        }
        Node currNode = head;
        while(i!=1) {
            currNode = currNode.next;
            i--;
        }
        currNode.next = currNode.next.next;
        size--;
    }
    public int get(int i) {
        checkRange(i);
        Node currNode = head;
        while(i!=0) {
            currNode = currNode.next;
            i--;
        }
        return currNode.elem;
    }
    public int length() {
        return size;
    }
    public int find(int elem) {
        Node currNode = head;
        int i = 0;
        while(currNode!=null) {
            if(currNode.elem==elem) {
                return i;
            }
            i++;
            currNode = currNode.next;
        }
        return -1;
    }
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        Node currNode = head;
        while(currNode!=null) {
            sb.append(currNode.elem);
            currNode = currNode.next;
            if(currNode!=null) {
                sb.append(',');
            }
        }
        sb.append(']');
        return sb.toString();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值