单链表常见操作

最近在重新学习数据结构和算法的知识,数据结构和算法问题本身比较枯燥和乏味,而且比较难不容易掌握,但是属于程序员内功的一部分,学习起来容易上瘾。

1. 单链表定义

package algorithm.datastructors;/*** 单向链表* @author i324779*/
public class ListNode {private int data;private ListNode next;public ListNode(int data) {this.data = data;}public int getData() {return data;}public void setData(int data) {this.data = data;}public ListNode getNext() {return next;}public void setNext(ListNode next) {this.next = next;}
}

2, 单链表的一些常见操作

package algorithm.datastructors;import java.util.Stack;/*** 单链表的一些操作** @author i324779*/
public class ListNodeOperation {/*** 找到链表的中间节点* 使用两个指针。让第一个指针的移动速度是另一个的两倍。* 当第一个指针到达表尾时,另一个指针则指向中间节点。* Note:如果链表节点数为奇数,则第(n/2)个节点为中间节点。** @param head* @return*/ListNode findMiddle(ListNode head) {ListNode ptr1x, ptr2x;ptr1x = head;ptr2x = head;int i = 0;// 不断循环,直至达到表尾(next后继指针为null,就表示达到最后一个节点)while (ptr1x.getNext() != null) {if (i == 0) {ptr1x = ptr1x.getNext();i = 1;} else {// 两个指针都后移ptr1x = ptr1x.getNext();ptr2x = ptr2x.getNext();i = 0;}}return ptr2x;}/*** 从表尾开始输出链表。** @param head*/void printListFromEnd(ListNode head) {if (head == null) {return;}printListFromEnd(head.getNext());System.out.println(head.getData());}/*** 检查链表的长度是奇数还是偶数。* 使用一个在链表中每次向后移动两个节点的指针。* 最后,如果指针值为null,那么聊表长度为偶数;* 否则指针指向表尾节点,链表长度为奇数。** @param head* @return*/public int isLinkedListLengthEven(ListNode head) {while (head != null && head.getNext() != null) {head = head.getNext().getNext();}if (head == null) {return 0;} else {return 1;}}/*** 合并两个有序链表为一个新的有序链表。** @param node1* @param node2* @return*/public ListNode mergeList(ListNode node1, ListNode node2) {if (node1 == null) {return node2;}if (node2 == null) {return node1;}ListNode result;if (node1.getData() <= node2.getData()) {result = node1;result.setNext(mergeList(node1.getNext(), node2));} else {result = node2;result.setNext(mergeList(node2.getNext(), node1));}return result;}/*** 逆置单向链表。** @param head 表头* @return 逆置后的单向链表。*/ListNode reverseList(ListNode head) {ListNode temp = null;ListNode nextNode;while (head != null) {nextNode = head.getNext();head.setNext(temp);temp = head;head = nextNode;}return temp;}/*** 找到链表的倒数第n个结点* 使用一次链表扫描解决问题。* 使用两个指针pNthNode和pTemp。* 首先,两个指针都指向链表的头结点。仅当pTemp(沿着链表)进行了n次移动后,* pNthNode才开始移动。然后两个指针同时移动直至tTemp到达表尾。* 这时pNthNode指针所指的结点就是所求的结点,也就是链表的倒数第n个结点。** @param head* @param nthNode* @return*/ListNode nthNodeFromEnd(ListNode head, int nthNode) {ListNode pTemp = head;ListNode pNnthNode = null;for (int count = 1; count < nthNode; count++) {if (pTemp != null) {pTemp = pTemp.getNext();}}while (pTemp != null) {if (pNnthNode == null) {pNnthNode = head;} else {pNnthNode = pNnthNode.getNext();}pTemp = pTemp.getNext();}return pNnthNode;}/*** 给定两个有序单链表的头指针head1 和head2, 打印两个链表的公共部分。** @param head1 有序链表1* @param head2 有序链表2*/public void printCommonPart(ListNode head1, ListNode head2) {if (head1 == null || head2 == null) {System.out.println("Node is null");return;}System.out.println("Common Part: ");while (head1 != null && head2 != null) {if (head1.getData() < head2.getData()) {head1 = head1.getNext();} else if (head1.getData() > head2.getData()) {head2 = head2.getNext();} else {System.out.println(head1.getData());head1 = head1.getNext();head2 = head2.getNext();}}}/*** 判断是否有环** @param head 链表头结点* @return 是否有环*/public static boolean isCycle(ListNode head) {ListNode p1 = head;ListNode p2 = head;while (p2 != null && p2.getNext() != null) {p1 = p1.getNext();p2 = p2.getNext().getNext();if (p1 == p2) {return true;}}return false;}/*** 逐对逆置链表** @param head* @return*/private void reversePairRecursive(ListNode head) {if (head == null || head.getNext() == null) {return;}ListNode cur = head.getNext();ListNode pre = head;ListNode next;while (cur != null && cur.getNext() != null) {next = cur.getNext().getNext();pre.setNext(cur.getNext());cur.getNext().setNext(cur);cur.setNext(next);pre = cur;cur = next;}}/*** 判断一个链表是否为回文结构** @param head 单链表的头结点* @return true:回文结构;false:不是回文结构*/public boolean isPalindrome(ListNode head) {Stack<ListNode> stack = new Stack<>();ListNode cur = head;while (cur != null) {stack.push(cur);cur = cur.getNext();}while (head != null) {if (head.getData() != stack.pop().getData()) {return false;}head = head.getNext();}return true;}public static void main(String[] args) {ListNodeOperation operation = new ListNodeOperation();int i = 1;ListNode head = new ListNode();head.setNext(null);ListNode tmp;ListNode cur = head;for (; i < 8; i++) {tmp = new ListNode();tmp.setData(i);tmp.setNext(null);cur.setNext(tmp);cur = tmp;}System.out.println("顺序输出:");for (cur = head.getNext(); cur != null; cur = cur.getNext()) {System.out.print(cur.getData() + " ");}operation.reversePairRecursive(head);System.out.println("\n逆序输出:");for (cur = head.getNext(); cur != null; cur = cur.getNext()) {System.out.print(cur.getData() + " ");}}
}

转载于:https://www.cnblogs.com/IcanFixIt/p/10471386.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第五届省赛JAVA真题----最长公共子序列

一个串的子串是指该串的一个连续的局部。如果不要求连续&#xff0c;则可称为它的子序列。 比如对串&#xff1a; "abcdefg" 而言&#xff0c;"ab","abd","bdef" 等都是它的子序列。 特别地&#xff0c;一个串本身&#xff0c;以及空串…

Python divmod() 函数

Python divmod() 函数 Python 内置函数 python divmod() 函数把除数和余数运算结果结合起来&#xff0c;返回一个包含商和余数的元组(a // b, a % b)。 在 python 2.3 版本之前不允许处理复数。 函数语法 divmod(a, b)参数说明&#xff1a; a: 数字b: 数字实例 >>>div…

蓝桥杯第五届省赛JAVA真题----单位分数

形如&#xff1a;1/a 的分数称为单位分数。 可以把1分解为若干个互不相同的单位分数之和。 例如&#xff1a; 1 1/2 1/3 1/9 1/18 1 1/2 1/3 1/10 1/15 1 1/3 1/5 1/7 1/9 1/11 1/15 1/35 1/45 1/231 等等&#xff0c;类似这样的分解无穷无尽。我们增加一个约…

.NET面试题总结

1、c#垃圾回收机制 从以下方面入手展开&#xff1a; 1、压缩合并算法 2、代的机制 3、GC调用终结器 2、委托和事件 先说它的定义&#xff1a;委托的本质是类&#xff0c;类型安全的指针&#xff0c;然后从用途上考虑&#xff0c;事件是包装的委托&#xff0c;但事件不是委托…

蓝桥杯第六届省赛JAVA真题----垒骰子

垒骰子 赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。 经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01; 我们先来规范一下骰子&#xff1a;1 …

JAVA应试技巧----大数开方

大数开方--牛顿迭代法&#xff1a; 如果一个数的位数为偶数个&#xff0c;那么这个数开方之后就有n/2位&#xff1b; 如果一个数的位数为奇数个&#xff0c;那么这个数开方之后就有n/21位&#xff1b; 我们以num1000为例&#xff0c;位数为4&#xff0c;偶数&#xff0c;那么开…

蓝桥杯历届试题----矩阵翻硬币

矩阵翻硬币 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵。随后&#xff0c;小明对每一个硬币分别进行一次 Q 操作。对第x行第y列的硬币进行 Q 操作的定义&#xff1a;将所有第 i*x 行&#xff0c;第 j*y 列的硬币进行翻转。其中i和j为任意使操作可行的正整数&#xff0…

并发队列、线程池、锁

1、CountDownLatch(计数器) CountDownLatch 类位于java.util.concurrent包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务A&#xff0c;它要等待其他任务执行完毕之后才能执行&#xff0c;此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是…

POJ 1088----滑雪(DP)

原题连接&#xff1a;http://poj.org/problem?id1088 Description Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获得速度&#xff0c;滑的区域必须向下倾斜&#xff0c;而且当你滑到坡底&#xff0c;你不得不再次走上坡或者等待升降机来载你。Mic…

Vijos 1603 ----迷宫(矩阵乘法,矩阵快速幂)

描述 在某个神秘的星球上有一个游乐园 游乐园里有一个奇怪的迷宫&#xff0c;迷宫内有n个点&#xff0c;每个点之间都可能会有一条有向边&#xff08;可能会有自环&#xff09; 现在游乐园主有个问题想请你帮忙&#xff1a; 问&#xff1a;从s点走到f点&#xff0c;恰好走过…

蓝桥杯第六届省赛JAVA真题----循环节长度

循环节长度 两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为&#xff1a;循环节。 比如&#xff0c;11/136>0.846153846153….. 其循环节为[846153] 共有6位。 下面的方法&#xff0c;可以求出循环节的长度。 请仔细阅读代码&#xff0c;并填写…

蓝桥杯第六届省赛JAVA真题----打印菱形

打印菱形 给出菱形的边长&#xff0c;在控制台上打印出一个菱形来。 为了便于比对空格&#xff0c;我们把空格用句点代替。 当边长为8时&#xff0c;菱形为&#xff1a; .......* ......*.* .....*...* ....*.....* ...*.......* ..*.........* .*...........* *..........…

蓝桥杯第六届省赛JAVA真题----生命之树

生命之树 在X森林里&#xff0c;上帝创建了生命之树。 他给每棵树的每个节点&#xff08;叶子也称为一个节点&#xff09;上&#xff0c;都标了一个整数&#xff0c;代表这个点的和谐值。 上帝要在这棵树内选出一个非空节点集S&#xff0c;使得对于S中的任意两个点a,b&#…

蓝桥杯第七届省赛JAVA真题----剪邮票

剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来&#xff0c;要求必须是连着的。 &#xff08;仅仅连接一个角不算相连&#xff09; 比如&#xff0c;【图2.jpg】&#xff0c;【图3.jpg】中&#xff0c;粉红色所示部分就是合格的剪取。 请你…

PAT甲级1080 Graduate Admission【模拟】

题目&#xff1a;https://pintia.cn/problem-sets/994805342720868352/problems/994805387268571136 题意&#xff1a; 模拟高考志愿录取。 考生根据总成绩和高考成绩排名。根据排名往下录取&#xff0c;每个人有k个志愿。 如果他填的学校名额没有满&#xff0c;那么就可以被录…

蓝桥杯第三届省赛JAVA真题----取球博弈

题目描述 今盒子里有n个小球&#xff0c;A、B两人轮流从盒中取球&#xff0c;每个人都可以看到另一个人取了多少个&#xff0c;也可以看到盒中还剩下多少个&#xff0c;并且两人都很聪明&#xff0c;不会做出错误的判断。 我们约定&#xff1a; 每个人从盒子中取出的球的数目…

目标检测之YOLO V2 V3

YOLO V2 YOLO V2是在YOLO的基础上&#xff0c;融合了其他一些网络结构的特性&#xff08;比如&#xff1a;Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷积核等&#xff09;&#xff0c;进行的升级。其目的是弥补YOLO的两个缺陷&#xff1a; YOLO中的大量的定位错误和基于区域…

蓝桥杯第五届省赛JAVA真题----n级台阶

有n级台阶。从地面&#xff08;第0级&#xff09;出发&#xff0c;首先连续的上台阶&#xff0c;上到不超过第n级的某一个位置后再连续的下台阶&#xff0c;直到回到地面。若每次上下台阶只允许走1级或2级&#xff0c;请问可能的上下台阶的方案数是多少&#xff1f; 特别地&am…

ubuntu下安装oracle

开源的世界挺有意思&#xff0c;安装oracle如此复杂。 主要分为四个大步骤&#xff1a; Java的安装Oracle安装前的准备Oracle的安装环境配置安装Oracle1、Java安装&#xff08;略&#xff09; 这一步网上有好多教程&#xff0c;大家可以自行安装。 验证Java是否安装成功&#x…

蓝桥杯第五届省赛JAVA真题----七对数字

今有7对数字&#xff1a;两个1&#xff0c;两个2&#xff0c;两个3&#xff0c;…两个7&#xff0c;把它们排成一行。 要求&#xff0c;两个1间有1个其它数字&#xff0c;两个2间有2个其它数字&#xff0c;以此类推&#xff0c;两个7之间有7个其它数字。如下就是一个符合要求的…