Java数据结构 -- 链表

Java数据结构 – 链表(没有使用静态方法)自学 头插

创建一个结点类

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

创建开始构建链表以及相应的方法

public class LinkList {
    private Node head;
    private int size;

    public LinkList() {
        head = null;
        size = 0;
    }

    /**
     * 初始化(一个方法最好只做一件事)
     */
    public void InitLinkList() {
        System.out.println("请输入元素个数n");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println("请依次输入n个元素:");
        while(n-- > 0) {
            Object data = scanner.next();
            Node temp = new Node(data);
            temp.next = head;
            head = temp;
            size++;
        }
    }

    /**
     * 链表是否为空
     * @return 为空 true
     */
    public boolean IsEmpty() {
        return size == 0;
    }

    /**
     * 根据下标寻找下标结点的前一结点(方便进行插入删除操作)
     * @param index 下标
     * @return  返回要插入节点的前一个节点,没有则返回 null
     */
    public Node findIndexNode(int index) {
        int dex = 0;
        Node tempHead = head;
        while(tempHead != null) {
            //找到插入结点之前的结点
            if(dex == index - 1) {
                System.out.println("寻找的将要操作结点的前一个结点为" + tempHead.data + " 下标为" + dex);
                return tempHead;
            }
            tempHead = tempHead.next;
            dex++;
        }
        return null;
    }

    /**
     * 根据元素寻找下标
     * @param data  要查找的元素
     * @return 查找元素的下标
     */
    public int findIndex(Object data) {
        int index = -1;
        Node tempHead = head;
        while(tempHead != null) {
            index++;
            if(tempHead.data.equals(obj)) {
                System.out.println("查找元素的下标为:" + index);
                return index;
            }
            tempHead = tempHead.next;
        }
        return index;
    }

    /**
     * 在表尾插入元素
     * @param data 要插入元素
     */
    public void InsertLinkList(Object data) {
        InsertLinkList(size, data);
    }

    /**
     * 在下标处插入
     * @param index 插入的下标
     * @param data 插入的数据
     */
    public void InsertLinkList(int index, Object data) {
        if(index < 0 || index > size) {
            System.err.println("非法插入!");
            return ;
        }
        Node temp = new Node(data);
        Node node = findIndexNode(index);
        //如果要插入下标前没有结点
        if(node == null) {
            temp.next = head;
            head = temp;
            size++;
            return ;
        }

        //进行插入
        temp.next = node.next;
        node.next = temp;
        size++;
    }

    /**
     * 根据下标删除元素
     * @param index 要删除的元素下标
     */
    public void DeleteLinkList(int index) {
        if(index < 0 || index > size) {
            System.err.println("非法删除!");
            return ;
        }
        Node temp = new Node();
        Node node = findIndexNode(index);
        if(node == null) {//删除元素的前一个元素为空(删除第一个)
            //temp = head;
            head = head.next;
            //temp = null;
            return ;
        }

        //进行删除
        //temp = node.next;
        node.next = node.next.next;
        //temp = null;

    }

    /**
     * 打印链表
     */
    public void Print() {
        Node headNode = head;
        while (headNode != null) {
            System.out.print(headNode.data + " ");
            headNode = headNode.next;
        }
        System.out.println();
    }
}

测试类

public class Test {

    public static void main(String[] args) {
        LinkList L = new LinkList();
        System.out.println(L.IsEmpty());
        L.InitLinkList();
        System.out.println("链表长度size = " + L.getSize() + "\n插入之前元素:");
        L.Print();
        System.out.println();
        L.InsertLinkList("(*^▽^*)");
        L.InsertLinkList(L.getSize(), "嗨");
        L.Print();
        System.out.println("链表长度size = " + L.getSize() + "\n删除元素:");
        L.DeleteLinkList(4);
        L.Print();
    }
}


打印的结果

true
请输入元素个数n
5
请依次输入n个元素:
1 2 3 4 5
链表长度size = 5
插入之前元素:
5 4 3 2 1

寻找的将要操作结点的前一个结点为1 下标为4
寻找的将要操作结点的前一个结点为() 下标为5
5 4 3 2 1 () 嗨
链表长度size = 7
删除元素:
寻找的将要操作结点的前一个结点为2 下标为3
5 4 3 2 () 嗨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值