数据结构-线性表-模拟实现单链表

单链表实现

创建节点类

public class Node {
    /**
     * 为了便于理解 不使用private修饰
     */
    Object data;//存储数据的引用
    Node next;//下一个节点的引用
public Node() {
    }

    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }
 }

创建链表类

public class SingleLinkedList implements List {

    private Node head = new Node();//头节点,不存储数据,为了编程方便
    
    private int size;//一共有几个结点
    }

查找第i 个节点的值

在单链表中进行查找操作只能从链表的首节点开始,通过每个节点的next 引用来依次访问链表中的每个节点,以完成相应的查找操作

public Object get(int i) {
//如果i的位置错误报异常
        if (i<0 ||i >size){
            throw new MyArrayIndexOutOfBoundsException("指针越界异常:"+"i");
        }
        //和顺序表不一样了,不能通过索引直接定位,需要从头节点开始进行查找
        //从头节点开始移动指针
        Node p = head;
        for (int j = 0; j <= i; j++) {
            p = p.next;
        }
        return p.data;
    }

添加节点操作

添加节点不需要移动元素,只需要修改元素的指针
需要先查找到添加位置i,再添加新节点

public void add(int i, Object e) {
        //如果i的位置错误报异常
        if (i < 0 || i > size){
            throw new MyArrayIndexOutOfBoundsException("指针越界异常:"+"i");
        }
        //找到前一个节点,从头节点head开始移动指针
        Node p = head;
        for (int j = 0; j < i; j++) {
            p = p.next;
        }
        //新创建一个节点
        Node newNode = new Node(e,null);
        //需要先指明新节点的直接后继节点,
        newNode.next = p.next;
        //再指明新节点的直接前驱节点
        p.next = newNode;
        //节点个数+1
        size++;
    }

删除节点操作

public Object remove(int i) {
        if (i < 0 || i > size){
            throw new MyArrayIndexOutOfBoundsException("指针越界异常:"+"i");
        }
        Node p = head;
        for (int j = 0; j < i; j++) {
            p = p.next;
        }
        Node temp = p.next;
        p.next = temp.next;
        temp.next = null;
        size--;
        return temp.data;
    }
阅读 119

推荐阅读