手写单链表结构

·  阅读 50

定义链表结构

public class MyLinkList {
    private Node head;
    private Node last;
    private int size;
}
复制代码

定义node结构

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

复制代码

定义添加node

 public void insertData(int data, int index) throws Exception {

        Node insertNode = new Node(data);

        if (index > size) {
            throw new Exception("index 应该小于size");
        }
        if (size == 0) {//创建链表  为空
            head = insertNode;
            last = insertNode;
        } else if (index == 0) {
            insertNode.next = head; //插入头部的head 指向老的head
            head = insertNode; //重置head
        } else if (index == size) {//插入尾部
            last.next = insertNode;//原来的last 变成倒数第二个  next 指向insertNode
            last = insertNode; // 重置last  执行新的insertNode
        } else {
            //中间插入
            Node pre = getNode(index - 1);//获取需要插入的node 前一个node
            insertNode.next = pre.next;  // 需要插入的node next 等于原来链表位置的node 的下一个node
            pre.next = insertNode;//原来的node next 指向插入的node;
        }
        size++;

    }
复制代码

获取node节点

private Node getNode(int index) throws Exception {
        if (index < 0 || index > size) {
            throw new Exception("index 下标越界");
        }
        Node temp = head;//链表只能从头部查起
        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }
        return temp;

    }
复制代码

删除node节点

public void deleteNode(int index) throws Exception {
        if (size == 0 || index <= 0 || index > size) {
            throw new Exception("下标越界");
        }
        if (index == 0) {
            //从头删除
            head = head.next;
        } else if (index == size - 1) {
            Node node = getNode(index - 1);//得到尾部上一个节点
            node.next = null;
            last = node;//上一个节点置为 last;
        } else {
            // 从中间删除
            Node pre = getNode(index - 1);//得到尾部上一个节点
            pre.next = pre.next.next;  //前一个节点的下下一个节点是需要连接的节点;

        }
        size--;
    }

复制代码

打印node链表数据


    /**
     * 打印链表.
     */
    public void print() {
        if (size <= 0) {
            throw new IndexOutOfBoundsException("数据为空!");
        }
        Node temp = head;
        StringBuffer sb = new StringBuffer();
        sb.append(temp.data);
        for (int i = 0; i < size; i++) {
            if (temp.next != null) {
                temp = temp.next;
                sb.append("===>" + temp.data);
            }
        }
        System.out.println("temp.data" + sb.toString());
    }
复制代码

测试

public static void main(String[] args) {
        MyLinkList myLinkList = new MyLinkList();
        try {
            myLinkList.insertData(2, 0);
            myLinkList.print();
            myLinkList.insertData(3, 1);
            myLinkList.print();
            myLinkList.insertData(4, 0);
            myLinkList.print();
            myLinkList.insertData(5, 3);
            myLinkList.print();
            myLinkList.insertData(45, 4);
            myLinkList.print();
            myLinkList.insertData(67, 3);
            myLinkList.print();
            myLinkList.insertData(63, 1);
            myLinkList.print();
            myLinkList.deleteNode(5);
            myLinkList.print();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
复制代码

测试链表结构

temp.data2
temp.data2===>3
temp.data4===>2===>3
temp.data4===>2===>3===>5
temp.data4===>2===>3===>5===>45
temp.data4===>2===>3===>67===>5===>45
temp.data4===>63===>2===>3===>67===>5===>45
temp.data4===>63===>2===>3===>67===>45
复制代码
分类:
Android
标签:
分类:
Android
标签: