翻转链表中第米个节点到第Ñ个节点的部分
样例
给出链表1-> 2-> 3-> 4-> 5-> null,m = 2和n = 4,返回1-> 4-> 3-> 2-> 5-> null
挑战
在原地一次翻转完成
解题思路:
在[m,n]区间翻转的操作与Lintcode 35:Reverse Linked List相同,就是设立pre,cur,next三指针进行翻转。重要的是如何将部分翻转后的链表与原链表结合,就需要设立指针P1指向米前一个元素,用来连接翻转后的节点,具体看图:

根据以上思路,代码如下:
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: ListNode head is the head of the linked list
* @param m: An integer
* @param n: An integer
* @return: The head of the reversed ListNode
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
// write your code here
ListNode dummy = new ListNode(0);
dummy.next = head;
//指向第m节点前一个节点的指针,方便后续连接操作
ListNode mPre = null;
//初始化pre,cur是翻转链表的指针,使其指向正确的位置
ListNode pre = dummy;
ListNode cur = head;
for(int i=0; i<m; i++){
mPre = pre;
pre = pre.next;
cur = cur.next;
}
//翻转链表操作
for(int i=m; i<n; i++){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
//最后处理两部分连接
mPre.next.next = cur;
mPre.next = pre;
return dummy.next;
}
}
二刷:
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: ListNode head is the head of the linked list
* @param m: An integer
* @param n: An integer
* @return: The head of the reversed ListNode
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
// write your code here
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode prepre = null;
for(int i=0; i<m; i++){
prepre = pre;
pre = pre.next;
}
int times = n-m;
ListNode cur = pre.next;
while(cur != null && times > 0){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
times--;
}
prepre.next.next = cur;
prepre.next = pre;
return dummy.next;
}
}

本文介绍了一种在链表中翻转指定区间的算法,并通过实例详细解释了如何使用三个指针来实现这一过程。此外,还提供了两种不同的实现代码,帮助读者更好地理解并掌握该算法。
1688

被折叠的 条评论
为什么被折叠?



