菜鸡每日一题系列打卡92天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
反转从位置m到n的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
题目分析
这是一道关于链表的题目,属于反转整个链表的题目的变型,难度不大,可以采用递归或者迭代的方式进行实现。
考虑到递归可能带来额外的栈空间开销,菜鸡将采用迭代的方式进行实现。根据题目要求,需要在一趟扫描中完成结果,可以参考如下步骤进行实现:
找到需要反转的起始位置
记录反转后需要拼接的前缀结点
反转链表
拼接链表
返回结果
按照上述步骤即可在一趟扫描中完成反转。话不多说,上代码!
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
// 找到需要反转的起始位置
ListNode tmp = head, pre = null;
for (; m > 1; m--, n--) {
pre = tmp;
tmp = tmp.next;
}
// 记录反转后需要拼接的前缀结点
ListNode connect = pre, tail = tmp;
// 反转从位置m到n的链表
ListNode node = null;
for (; n > 0; n--) {
node = tmp.next;
tmp.next = pre;
pre = tmp;
tmp = node;
}
// 拼接链表
if (connect != null) connect.next = pre;
else head = pre;
tail.next = tmp;
// 返回结果
return head;
}
}
代码分析
对代码进行分析,程序对链表进行了最多一趟扫描,因此,时间复杂度为O(n);而就空间而言,仅仅使用了常数级别的额外空间,因此,空间复杂度为O(1)。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到