用Java手写链表

public class LinkedList<E> {

    private int size;
    private Node dummyHead;

    private class Node {
        private E e;
        private Node next;

        private Node(E e, Node next) {
            this.e = e;
            this.next = next;
        }

        private Node(E e) {
            this(e, null);
        }

        private Node() {
            this(null, null);
        }

        public String toString() {
            return e.toString();
        }
    }

    public LinkedList() {
        dummyHead = new Node();
        size = 0;
    }

    private void add(int index, E e) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("index too small or too large");
        }
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        prev.next = new Node(e, prev.next);
        size++;
    }

    private void addFirst(E e) {
        add(0, e);
    }

    private void addLast(E e) {
        add(size, e);
    }

    private E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("index too small or too large");
        }
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        Node del = prev.next;
        prev.next = prev.next.next;
        size--;
        return del.e;
    }

    private E removeFirst() {
        return remove(0);
    }

    private E removeLast() {
        return remove(size - 1);
    }

    private E get(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("index too small or too large");
        }
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        return prev.next.e;
    }

    private E getFirst() {
        return get(0);
    }

    private E getLast() {
        return get(size - 1);
    }

    private void set(int index, E e) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("index too small or too large");
        }
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        prev.next.e = e;
    }

    private boolean contains(E e) {
        boolean isExist = false;
        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
            if (e.equals(cur.e)) {
                isExist = true;
            }
        }
        return isExist;
    }

    private int getSize() {
        return size;
    }

    private boolean isEmpty() {
        return size == 0;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        Node cur = dummyHead.next;
        while (cur != null) {
            sb.append(cur.e + " > ");
            cur = cur.next;
        }
        sb.append("null");
        return sb.toString();
    }

    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        System.out.println("链表是否为空 " + linkedList.isEmpty());
        System.out.println("链表大小 " + linkedList.getSize());
        linkedList.add(0, 1);
        System.out.println(linkedList);
        System.out.println("链表是否为空 " + linkedList.isEmpty());
        System.out.println("链表大小 " + linkedList.getSize());
        linkedList.add(1, 2);
        System.out.println(linkedList);
        System.out.println("链表是否为空 " + linkedList.isEmpty());
        System.out.println("链表大小 " + linkedList.getSize());
        System.out.println(linkedList);
        linkedList.add(2, 3);
        linkedList.addLast(4);
        linkedList.addFirst(0);
        System.out.println(linkedList);
        System.out.println("第二个元素 " + linkedList.get(1));
        System.out.println("最后一个元素" + linkedList.getLast());
        System.out.println("第一个元素" + linkedList.getFirst());
        System.out.println("删除第五个元素 " + linkedList.remove(4));
        System.out.println(linkedList);
        System.out.println("删除第一个元素 " + linkedList.removeFirst());
        System.out.println(linkedList);
        System.out.println("删除最后一个元素 " + linkedList.removeLast());
        System.out.println(linkedList);
        System.out.println("是否包含3 " + linkedList.contains(3));
        System.out.println("是否包含2 " +linkedList.contains(2));
        linkedList.set(1, 3);
        System.out.println(linkedList);
        linkedList.set(0, 2);
        System.out.println(linkedList);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,手写链表(也称为单链表)是一种基础数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。创建和操作链表的便利之处在于它的动态性和灵活性,可以在运行时添加或删除元素,而不需要像数组那样预先分配固定大小。 下面是一个简单的Java链表节点和链表类的例子: ```java // 链表节点定义 class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } // 链表类定义 public class LinkedList { private Node head; // 头节点 // 插入节点方法 public void insert(int value) { Node newNode = new Node(value); if (head == null) { head = newNode; } else { Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } } // 查找节点方法 public boolean contains(int value) { Node current = head; while (current != null) { if (current.data == value) { return true; } current = current.next; } return false; } // 删除节点方法 public void remove(int value) { if (head == null) { return; } if (head.data == value) { head = head.next; return; } Node current = head; while (current.next != null && current.next.data != value) { current = current.next; } if (current.next != null) { current.next = current.next.next; } } // 显示链表元素(仅做演示,实际应用中可能有更优雅的方法) public void printList() { Node current = head; while (current != null) { System.out.print(current.data + " -> "); current = current.next; } System.out.println("null"); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值