双向链表的实现以及使用

本文介绍了如何使用Java实现一个自定义的链表类MyLinkList,包含头插法(addInHead)、尾插法(addInTail)、从头遍历(headForEach)、从尾遍历(tailForEach)以及按索引添加(addByIndex)方法,展示了链表的基本操作。
摘要由CSDN通过智能技术生成

方法解释

头插法 addInHead(Node node)

尾插法 addInTail(Node node)

从头遍历 headForEach()
从尾遍历 tailForEach()

按索引添加 addByIndex(int index,Node node)

Java类(自定义)

用到了MyLinkList的成员内部类Node

代码


public class linkedList {
    public static void main(String[] args) {
        MyLinkList myLinkList = new MyLinkList();

        MyLinkList.Node jack = myLinkList.new Node("jack");
        MyLinkList.Node tom = myLinkList.new Node("tom");
        MyLinkList.Node hsp = myLinkList.new Node("老韩");
        myLinkList.addInHead(jack);
        myLinkList.addInTail(tom);
        myLinkList.addInTail(hsp);
        myLinkList.headForEach();
        myLinkList.addByIndex(3, myLinkList.new Node("smith"));
        System.out.println("==============");
        myLinkList.headForEach();
        System.out.println("==============");
        myLinkList.tailForEach();
    }


}

class MyLinkList {
    public static int count;//节点个数

    class Node {
        public Object object;
        public Node next;
        public Node prev;

        public Node(Object object) {
            this.object = object;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "object=" + object +
                    '}';
        }
    }

    Node first;
    Node last;

    void addByIndex(int index, Node node) {
        if (!(index >= 0 && index <= count)) {
            throw new IndexOutOfBoundsException();
        }
        int count = 0;
        Node beforeNode = this.first;

        while (beforeNode.next != null) {
            if (index == 0)
                break;
            beforeNode = beforeNode.next;
            count++;
            if (count == index - 1) {
                break;
            }
        }
        Node afterNode = beforeNode.next;
        if (beforeNode == first) {
            addInHead(node);
            return;
        }
        if (afterNode == null) {
            addInTail(node);
            return;
        }
        node.next = afterNode;
        beforeNode.next = node;
        node.prev = beforeNode;
        afterNode.prev = node;
        MyLinkList.count++;
        return;

    }

    void addInTail(Node node) {
        if (first == null) {
            first = node;
        } else {
            last.next = node;
            node.prev = last;
        }
        last = node;
        count++;
    }

    void addInHead(Node node) {
        if (last == null) {
            last = node;
        } else {
            first.prev = node;
            node.next = first;
        }
        first = node;
        count++;
    }


    void headForEach() {
        Node next = first;
        while (next != null) {
            System.out.println(next);
            next = next.next;
        }

    }

    void tailForEach() {
        Node prev = last;
        while (prev != null) {
            System.out.println(prev);
            prev = prev.prev;
        }
    }
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值