题目描述:翻转一个链表的m到n位置,从第1开始数。
题目链接:Leetcode 92. Reverse Linked List II
代码如下
思路:要是不想再次遍历来拼接的话,需要在开始来进行一个记录拼接部分的开头和结尾。
/**
* 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) {
ªif (head == null){
return head;
}
ListNode p = head,newHead = null;
int i = 0,j = 0;
ListNode sh = null;
while( i < m - 1){
i++;
if (i == m-1){
sh = p; //前一个节点
}
p = p.next;
}
ListNode nn = null;
while(j < n - m + 1){
j++;
if(j==1){
nn = p;
}
ListNode tmp = p.next;
p.next = newHead;
newHead = p;
p = tmp;
}//翻转中间k个
ListNode dummy = head;
if(nn != null){
nn.next = p;
}
if (sh != null){
sh.next = newHead;
return head;
}else{
return newHead;
}
}
// return head;
// if (m==1){
// return newHead;
// }else{
// int k = 0;
// while(k < m - 2){
// dummy = dummy.next;
// k++;
// }
// dummy.next = newHead; //连接前部
// return head;
// }
}//优化后的代码
/**
* 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) {
if (head == null){
return head;
}
ListNode p = head,newHead = null;
int i = 0,j = 0;
while( i < m - 1){
i++;
p = p.next;
}
while(j < n - m + 1){
j++;
ListNode tmp = p.next;
p.next = newHead;
newHead = p;
p = tmp;
}//翻转中间k个
ListNode dummy = head;
ListNode p1 = newHead; //找翻转部分的末尾
while(p1.next != null){
p1 = p1.next;
}
p1.next = p; //连接末尾
if (m==1){ //考虑1直接返回 因为前面没有东西
return newHead;
}else{
int k = 0;
while(k < m - 2){
dummy = dummy.next;
k++;
}
dummy.next = newHead; //连接前部
return head;
}
}
}