题目链接:https://leetcode.com/problems/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.
解题思路:
这道题的考点还是链表就地逆置。没特别的新意。
因为给定的链接没有头结点,当逆置涉及到第一个节点时,操作会较其它有所不同,所以最好自己加上一个头结点。
逆置时,要找到两个最重要的节点。
第一个是,第 m 个结点的前驱。这样能容易地摘下第 m 个结点。
第二个是,第 n 个结点。使被逆置的结点方便地插入到第 n 个结点之后。
代码实现:
/**
* 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 || head.next == null)
return head;
ListNode headList = new ListNode(0);
headList.next = head;
ListNode p = headList;
int start = m;
while(start -- > 1)
p = p.next;
ListNode q = p;
start = m;
while((n - start) >= 0) {
q = q.next;
start ++;
}
while(p.next != q) {
ListNode tmp = p.next;
p.next = tmp.next;
tmp.next = q.next;
q.next = tmp;
}
return headList.next;
}
}
44 / 44 test cases passed.
Status: Accepted
Runtime: 0 ms