链表--设计链表

58 阅读2分钟

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

示例:

MyNode myNode = new MyNode();
MyNode.addAtHead(1);
MyNode.addAtTail(3);
// 链表变为1->2->3
MyNode.addAtIndex(1, 2);
// 返回3
MyNode.get(2);
// 现在链表为1->2
MyNode.deleteAtIndex(2);
MyNode.printNode();

代码:


public class MyNode {
    private static int size;
    private static Node dummyHead;

    public MyNode() {
        size = 0;
        dummyHead = new Node(-1);
    }

    // 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
    public static int get(int index) {
        if (index < 0 || index > size -1) {
            return -1;
        }
        Node cur = dummyHead.next;
        while (index-- > 0) {
            cur = cur.next;
        }
        return cur.val;
    }

    // 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    public static void addAtHead(int val) {
        Node newNode = new Node(val);
        newNode.next = dummyHead.next;
        dummyHead.next = newNode;
        size++;
    }

    // 在链表最后面添加一个节点
    public static void addAtTail(int val) {
        Node newNode = new Node(val);
        Node cur = dummyHead;
        while (cur.next != null) {
            cur = cur.next;
        }
        cur.next = newNode;
        size++;
    }

    // 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点
    public static void addAtIndex(int index, int val) {
        Node newNode = new Node(val);
        Node cur = dummyHead;
        while (index-- > 0) {
            cur = cur.next;
        }

        newNode.next = cur.next;
        cur.next = newNode;
        size++;
    }

    // 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
    public static void deleteAtIndex(int index) {
        if (index < 0 || index > size - 1) {
            return;
        }

        Node cur = dummyHead;
        while (index-- > 0) {
            cur = cur.next;
        }
        cur.next = cur.next.next;
        size--;
    }

    // 打印链表
    public static void printNode() {
        Node cur = dummyHead;
        while (cur.next != null) {
            System.out.println(cur.next.val);
            cur = cur.next;
        }
    }

    public static void main(String[] args) {
        MyNode myNode = new MyNode();
        MyNode.addAtHead(1);
        MyNode.addAtTail(3);
        MyNode.addAtIndex(1, 2);
        MyNode.get(2);
        MyNode.deleteAtIndex(2);
        MyNode.printNode();
    }

    static class Node {
        int val;
        Node next;

        public Node() {

        }

        public Node(int val) {
            this.val = val;
        }

        public Node(int val, Node next) {
            this.val = val;
            this.next = next;
        }

    }
}