单向链表

/**
 * @Author: subd
 * @Date: 2019/5/6 15:51
 */
public class SingleNodeList<E> {
    Node head;
    Node last;
    int size;

    private static class Node<E> {
        E item;
        Node<E> next;

        Node(E element) {
            this.item = element;
        }

        @Override
        public String toString() {
            return item.toString();
        }
    }

    public void add(E e) {
        Node<E> newNode = new Node(e);
        //第一次添加
        if (last == null) {
            head = newNode;
            last = newNode;
        } else {
            last.next = newNode;
            last = newNode;
        }
        size++;
    }

    public void add(int index, E e) {
        Node<E> newNode = new Node(e);
        if (index <= size && index >= 0) {
            if (size == 0) {
                //空链表
                head = newNode;
                last = newNode;
            } else if (size == index) {
                //尾部追加
                last = newNode;
                last.next = newNode;
            } else {
                //中间插入
                Node<E> pre = head;
                Node<E> next = head.next;
                int i = 1;
                while (i < index) {
                    pre = next;
                    next = next.next;
                    i++;
                }
                pre.next = newNode;
                newNode.next = next;
            }

        } else {
            throw new IndexOutOfBoundsException("索引越界!");
        }
        size++;
    }

    public E get(int index) {

        if (index >= 0 && index <= size) {
            int i = 0;
            Node<E> node = head;
            while (i < index) {
                node = node.next;
                i++;
            }
            return node.item;
        } else {
            throw new IndexOutOfBoundsException("索引越界!");
        }
    }

    public boolean remove(int index) {
        if (index >= 0 && index <= size) {
            if (size - 1 == 0) {
                //移除开头
                head = head.next;
                size--;
                return true;
            } else {
                //移除中间索引位置 移除最后一个也要这样走一个O(n)
                int i = 0;
                Node<E> node = head;
                while (i < index - 1) {
                    node = node.next;
                    i++;
                }
                //索引处的节点
                Node<E> cur = node.next;
                if (cur != null) {
                    node.next = cur.next;
                }
                size--;
                return true;
            }
        } else {
            throw new IndexOutOfBoundsException("索引越界!");
        }
    }

    public boolean remove(E e) {
        if (size <= 0) {
            throw new IndexOutOfBoundsException("索引越界!");
        }
        Node<E> node = head;
        int i = 0;
        while (node != null) {
            if (node.item.equals(e)) {
                remove(i);
            }
            i++;
            node = node.next;
        }
        return true;
    }

    public void reverse() {
        if (size <= 1) {
            return;
        }
        Node<E> pre = head;
        Node<E> cur = head.next;
        Node<E> tmp;
        while (cur != null) {
            tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        last = pre;
        head.next = null;
        head = last;
    }

    /**
     * 递归方式
     *
     * @param head
     */
    public void reverse(Node head) {
        if (head == null || head.next == null) {
            //将未入栈的初始list的尾部赋给head
            this.head = head;
            return;
        }
        //压栈
        reverse(head.next);
        //出栈
        head.next.next = head;
        head.next = null;
        //最后一个出栈的赋给last
        last = head;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        Node<E> node = head;
        for (int i = 0; i < size; i++) {
            sb.append(node.toString());
            node = node.next;
        }
        return "SingleNodeList{" +
                sb.toString() +
                '}';
    }

    public static void main(String[] args) {
        SingleNodeList<Integer> list = new SingleNodeList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
//        list.remove(2);
//        list.remove(4);
        list.reverse();
        System.out.println(list.toString() + "size:" + list.size);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值