
数据结构——链表(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; }
总结
今天的练习涉及了链表的基础操作,涵盖了遍历、反转、合并等多个方面。这些操作虽然看似基础,但对于编程实践至关重要。这类基础功底打下后,面对更复杂的数据结构时将更得心应手。发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月24日 12时34分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[白话解析] 深入浅出熵的概念 & 决策树之ID3算法
2019-03-06
[梁山好汉说IT] 梁山好汉和抢劫银行
2019-03-06
[源码解析] 消息队列 Kombu 之 基本架构
2019-03-06
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
[源码分析] 消息队列 Kombu 之 Consumer
2019-03-06
抉择之苦
2019-03-06
wx.NET CLI wrapper for wxWidgets
2019-03-06
ASP.NET MVC Action Filters
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
HTTP协议状态码详解(HTTP Status Code)
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06
04_Mysql配置文件(重要参数)
2019-03-06
python 序列化及其相关模块(json,pickle,shelve,xml)详解
2019-03-06
JavaSE总结
2019-03-06
手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
2019-03-06
Python IO编程
2019-03-06