Reverse Linked List II(翻转链表 II)

问题

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;
    }
}
    原文作者:天街孤独
    原文地址: https://www.jianshu.com/p/87b4fce09d8e#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞