问题
Reverse a linked list from position m to n.
Notice
Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
Have you met this question in a real interview? Yes
Example
Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL.
分析
在处理链表的时候,大家一定要注意,需要找的一般都是目标节点的前一个节点,否则是无法完成交换等操作的。另外为了解决要交换链表的头节点问题,我们可以new一个新的头节点出来,这样就可以把问题解决了。
对于这个问题,首先要遍历找到m和n的前一个节点的位置。因为是链表的翻转,不管是先找m的位置还是先找n的位置,思路是一样的。本文是n不动,依次把m放到n.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 node=new ListNode(0);
int i=1;
node.next=head;
head=node;
ListNode preM=null;
ListNode preN=null;
while(head!=null){
if(i==m){
preM=head;
}
if(i==n){
preN=head;
}
head=head.next;
i++;
}
ListNode nodeM=preM.next;
ListNode nodeN=preN.next;
ListNode afterN=nodeN.next;
head=nodeM;
while(head!=nodeN){
nodeM=head;
head=head.next;
nodeM.next=afterN;
afterN=nodeM;
}
nodeN.next=afterN;
preM.next=nodeN;
return node.next;
}
}