翻转链表中第米个节点到第Ñ个节点的部分
样例
给出链表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;
}
}