Description:
Reverse a linked list from position m to n. Do it in one-pass.
Note:
- 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
题意:给定一个链表,将链表的第mmm到第nnn个节点之间的那部分翻转;
解法:我们首先需要找到需要翻转的第一个节点,从这个节点开始对链表进行翻转,直到第nnn个节点;还需要记录两个位置节点,一个是第mmm个节点的前一个节点和第nnn个节点的后一个节点;例如对于链表1->2->3->4->5->NULL
先翻转mmm到nnn之间的节点,同时记录mmm之前和nnn之后的节点位置;
最后,将st的next指向ed,将prSt的next指向pr;
Java
/**
* 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) {
ListNode vHead = new ListNode(0);
vHead.next = head;
ListNode st = head;
ListNode ed = head;
ListNode pr = vHead;
ListNode prSt = vHead;
for (int i = 1; i <= n; i++) {
if (i < m) {
st = st.next;
ed = ed.next;
pr = pr.next;
prSt = prSt.next;
} else if (i == m) {
ed = ed.next;
pr = pr.next;
} else {
ListNode temp = ed.next;
ed.next = pr;
pr = ed;
ed = temp;
}
}
prSt.next = pr;
st.next = ed;
return vHead.next;
}
}