数据结构——链表(2)
发布日期:2021-05-15 01:35:04 浏览次数:16 分类:精选文章

本文共 3582 字,大约阅读时间需要 11 分钟。

单链表操作实践指南

前言

单链表作为数据结构中的基本之一,在编程实践中至关重要。对于编程新手而言,理解并掌握单链表的常用操作是一个奠基阶段。每一次操作都为后续复杂数据结构的操作积累经验,是一项值得的练习。

一、统计链表中节点的个数

简单直接的操作,是利用链表的特点,进行一次遍历即可完成。

/**     * 获取单链表的节点的个数     * @return 节点的总数     */    public int getCount() {        int count = 0;        temp = header;        if (header.next == null) {            System.out.println("链表为空");            return 0;        }        while (true) {            if (temp.next != null) {                temp = temp.next;                count++;            } else {                break;            }        }        return count;    }

二、寻找单链表的倒数第K个节点

目标节点即为 总节点个数 - K + 1。通过遍历找到目标节点即可完成。

/**     * 寻找单链表的倒数第K个节点     */    public Node getReciprocalIndexElement(int index) {        if (header.next == null) {            throw new IllegalArgumentException("节点不存在");        }        int allCount = getCount();        if (index > allCount || index <= 0) {            throw new IllegalArgumentException("节点不存在");        }        int targetIndex = allCount - index + 1;        int count = 0;        temp = header;        while (true) {            if (count != targetIndex) {                temp = temp.next;                count++;            } else {                return temp;            }        }    }

三、反转链表

新申请一个头结点,从原链表中逐个摘下节点,添加至新链表的最前端,最终将原链表的头结点指向新链表的节点。

/**     * 反转链表     */    public void reverseLinkedList() {        if (header.next == null || header.next.next == null) {            return;        }        cur = header.next;        next = null;        reverseHead = new Node();        while (cur != null) {            next = cur.next;            cur.next = reverseHead.next;            reverseHead.next = cur;            cur = next;        }        header.next = reverseHead.next;    }

四、逆序打印链表

可以通过栈的方式辅助完成,通过压栈和弹栈实现逆序打印。

/**     * 逆序打印链表     */    public void printListReverse(Node node) {        if (node != null) {            if (node.next != null) {                printListReverse(node.next);            }        }        if (!Objects.equals(header, node)) {            System.out.println(node);        }    }

五、合并两个有序链表

通过仿效二路归并的方式,逐步合并两个有序链表,确保合并后的链表依旧有序。

/**     * 合并两个有序链表     */    public static Node mergeTwoSortedLinkedList(Node firstLinkedList, Node secondLinkedList) {        if (firstLinkedList.header.next == null || secondLinkedList.header.next == null) {            throw new IllegalArgumentException("要合并的两个链表不符合要求");        }        Node firstHeader = firstLinkedList.header;        Node secondHeader = secondLinkedList.header;        Node firstTempNode = firstHeader.next;        Node secondTempNode = secondHeader.next;        Node endLinkedList = new SingleLinkedList<>();        Node endHeader = endLinkedList.header;        while (firstTempNode != null && secondTempNode != null) {            if (firstTempNode.data.level <= secondTempNode.data.level) {                endHeader.next = firstTempNode;                firstTempNode = firstTempNode.next;            } else {                endHeader.next = secondTempNode;                secondTempNode = secondTempNode.next;            }            endHeader = endHeader.next;        }        while (firstTempNode != null) {            endHeader.next = firstTempNode;            firstTempNode = firstTempNode.next;            endHeader = endHeader.next;        }        while (secondTempNode != null) {            endHeader.next = secondTempNode;            secondTempNode = secondTempNode.next;            endHeader = endHeader.next;        }        return endHeader;    }

总结

今天的练习涉及了链表的基础操作,涵盖了遍历、反转、合并等多个方面。这些操作虽然看似基础,但对于编程实践至关重要。这类基础功底打下后,面对更复杂的数据结构时将更得心应手。

上一篇:数据结构——链表(3)
下一篇:数据结构——链表(1)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年04月24日 12时34分33秒