[Leetcode] 92. Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

思路:根据题意可知,需要将给定数字之间的结点逆序
具体做法,给原来的链表添加一个伪头结点(这样做的好处:链表原来的结点可以当作普通结点处理,方便操作),获得要逆序结点的开头和结尾结点(为了方便操作,获取的是开始逆转结点的前一个结点和最终逆转结点的后一个结点,即中间那部分是需要逆转的结点),然后将中间结点做逆转,得到最终序列。

java 具体实现如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        if(head == null){
            return null;
        }
        if(m == n){
            return head;
        }
        int flag = 0;
        ListNode p1 = head;//用来指向开始反转结点的前一个结点
        ListNode p2 = head;//用来指向最后反转结点的后一个结点  p1---p2之间的结点是要反转的结点(不包含p1 p2)
        ListNode phead = new ListNode(0);
        phead.next = head;

        ListNode p = phead;
        while(p != null){
            flag++;
            if(flag == m){
                p1 = p;//指向开始逆转结点的前一个结点
            }
            if(flag == n+1){
                p2 = p.next;//指向结束逆转结点的后一个结点
                break;
            }
            p = p.next;
        }

        ListNode pp1 = p1.next;
        ListNode pp2 = pp1.next;
        ListNode pp3 = pp2.next;
        pp1.next = p2;
        while(pp3 != p2){
            pp2.next = pp1;
            pp1 = pp2;
            pp2 = pp3;
            pp3 = pp3.next;
        }
        pp2.next = pp1;
        p1.next = pp2;
        return phead.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值