算法:翻转链表||
2021/6/1 14:21:01
本文主要是介绍算法:翻转链表||,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
class Solution { // Object level variables since we need the changes // to persist across recursive calls and Java is pass by value. private boolean stop; private ListNode left; public void recurseAndReverse(ListNode right, int m, int n) { // base case. Don't proceed any further if (n == 1) { return; } // Keep moving the right pointer one step forward until (n == 1) right = right.next; // Keep moving left pointer to the right until we reach the proper node // from where the reversal is to start. if (m > 1) { this.left = this.left.next; } // Recurse with m and n reduced. this.recurseAndReverse(right, m - 1, n - 1); // In case both the pointers cross each other or become equal, we // stop i.e. don't swap data any further. We are done reversing at this // point. if (this.left == right || right.next == this.left) { this.stop = true; } // Until the boolean stop is false, swap data between the two pointers if (!this.stop) { int t = this.left.val; this.left.val = right.val; right.val = t; // Move left one step to the right. // The right pointer moves one step back via backtracking. this.left = this.left.next; } } public ListNode reverseBetween(ListNode head, int m, int n) { this.left = head; this.stop = false; this.recurseAndReverse(head, m, n); return head; } }
class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { // Empty list if (head == null) { return null; } // Move the two pointers until they reach the proper starting point // in the list. ListNode cur = head, prev = null; while (m > 1) { prev = cur; cur = cur.next; m--; n--; } // The two pointers that will fix the final connections. ListNode con = prev, tail = cur; // Iteratively reverse the nodes until n becomes 0. ListNode third = null; while (n > 0) { third = cur.next; cur.next = prev; prev = cur; cur = third; n--; } // Adjust the final connections as explained in the algorithm if (con != null) { con.next = prev; } else { head = prev; } tail.next = cur; return head; } }
参考力扣
这篇关于算法:翻转链表||的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现