本文主要是介绍冲击大厂算法面试=>链表专题【链表反转之局部反转】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录标题
- 反转链表II🤣局部反转
- 上代码
- 题解呀
- 实在不会的时候记住
反转链表II🤣局部反转
感觉会又有点不会!!!😢
上代码
class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {ListNode preHead = new ListNode(-1);preHead.next = head;ListNode cur = preHead; //使用前置节点移动,解决left=0的问题// 第一段移动 for (int i = 1; i < left; i++) {cur = cur.next;}ListNode node1 = cur; //思考node1含义printWithoutNull("node1=", node1);ListNode node2 = node1.next; //思考node2含义printWithoutNull("node2=", node2);// 继续移动 cur贯穿始终for (int i = 0; i <= right - left; i++) {cur = cur.next;}ListNode node3 = cur; //思考node3含义printWithoutNull("node3=", node3);ListNode node4 = node3.next; //思考node4含义printWithoutNull("node4=", node4);//找到每个node点后切断、反转、连接node1.next = null;node3.next = null;reverse(node2);node1.next = node3;node2.next = node4;return preHead.next;}//日志打印public void printWithoutNull(String prefix, ListNode node) {if (node == null) {System.out.println(prefix + "null");} else {System.out.println(prefix + node.val);}}//反转链表public ListNode reverse(ListNode head) {ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode nextNode = cur.next;cur.next = pre;pre = cur;cur = nextNode;}return pre;}
}
题解呀
- 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论!
- 思考node1、2、3、4 都是表示的哪些点,可以画一画!
- 思考cur移动的过程
- 理解 切断、反转、连接
比如:链表:1->2->3->4->5,我们虚拟头结点-1
执行代码时:node1=1、node2=2、node3=4、node4=5然后从node1到node2断开,从node3到node4断开,这个时候变成了三段1、2->->3->4、5
然后翻转2->->3->4为4->3->2
最后再连接 1->4->3->2->5
实在不会的时候记住
时间复杂度:整个算法的时间复杂度为O(n),其中n是链表的长度。需要遍历链表两次,一次是找到left和right节点,一次是反转指定区间的链表。
空间复杂度:算法的空间复杂度为O(1),只使用了常数级别的额外空间。
有用的话就点个赞再走吧!
这篇关于冲击大厂算法面试=>链表专题【链表反转之局部反转】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!