手写数据结构-链表

一、基础接口设计

接口是考虑到扩展性以及规范化而准备的,我们设计的链表主要有以下这些接口,完成基本功能即可。


public interface list {
   

    int size();

    void addFirst(Object data);

    void addLast(Object data);

    void add(Object data, int index) throws Exception;

    void removeFirst() throws Exception;

    void removeLast() throws Exception;

    void remove(int index) throws Exception;

    void remove(Object data) throws Exception;

    Object getFirst();

    Object getLast();

    Object get(int index) throws Exception;

    boolean contains(Object data);

    void clear();
}

二、单向简单链表

2.1 功能简介

  1. 链表的基本功能满足

2.2 代码

/**
 * 单向简单指针链表
 * <p>
 * head --> node1 --> node2 --> node3  <-- last
 */
public class MySingleList implements list {
   

    private class ListNode {
   
        private Object data;
        public ListNode next;

        public ListNode(Object data) {
   
            this.data = data;
        }
    }

    private ListNode head;
    private ListNode last;
    private int size;

    public MySingleList() {
   
    }

    @Override
    public int size() {
   
        return this.size;
    }

    /**
     * 头节点插入
     * <p>
     * head --> newNode --> node1 --> node2 --> node3  <-- last
     */
    @Override
    public void addFirst(Object data) {
   
        ListNode f = head;
        ListNode newNode = new ListNode(data);
        // head指向newNode
        head = newNode;
        if (f == null) {
   
            // f为空,这个节点就是第一个节点,head与last都指向newNode
            last = newNode;
        } else {
   
            // f不为空,按照标准头节点插入处理
            newNode.next = f;
        }
        this.size++;
    }

    /**
     * 尾节点插入
     * <p>
     * head --> node1 --> node2 --> node3 --> newNode <-- last
     */
    @Override
    public void addLast(Object data) {
   
        ListNode l = last;
        ListNode newNode = new ListNode(data);
        // last指向newNode
        last = newNode;
        if (l == null) {
   
            // l为空,这个节点就是第一个节点,head与last都指向newNode
            head = newNode;
        } else {
   
            // l不为空,按照标准尾节点插入处理
            l.next = newNode;
        }
        this.size++;
    }

    /**
     * 中间节点插入
     * <p>
     * head --> node1 --> node2 --> newNode --> node3 <-- last
     */
    private void addMiddle(Object data, int index) {
   
        ListNode pre = find(index - 1);
        ListNode newNode = new ListNode(data);
        newNode.next = pre.next;
        pre.next = newNode;
        this.size++;
    }


    /**
     * 在指定位置插入节点
     */
    @Override
    public void add(Object data, int index) throws Exception {
   
        if (index > this.size - 1 || index < 0) {
   
            throw new Excepti
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值