赞
踩
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表 ,如下图所示:
使用一次遍历完成反转。
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
又如,下述示例:
输入:head = [5], left = 1, right = 1 输出:[5]
所谓双指针法就是,一个指针用指向第一个需要反转节点的前一个节点,一个指针指向第一个要反转的节点上。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { if(head == null || left == right || left > right){ return head; } ListNode res = new ListNode(-1); res.next = head; ListNode pre = res; ListNode point = res.next; for(int i=1; i<=left-1; i++){ pre = pre.next; point = point.next; } for(int j=1; j<=right-left; j++){ // 反转left-right间节点 ListNode node = point.next; point.next = point.next.next; node.next = pre.next; pre.next = node; } return res.next; } }
根据以上算法思路和编码实现,时间复杂度为O(n),空间复杂度为O(1)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。