题目:
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
解答:
一开始的思路是重新创建一个链表,遍历原链表的同时插入新链表,需要反转的部分则反向插入即可。但这样需要消耗额外的空间,所以改为采用在原链表上进行反转。
具体思路为:
- 创建虚拟结点 prehead,指向头结点,并创建 node 结点用来遍历链表
- 遍历链表,至 node 指向需要反转的第一个结点的前一个结点
- 创建结点 cur 指向 node.next,cur即原链表中需要反转的第一个结点
- 接着遍历链表需要反转的部分,将当前反转的结点即为 temp,将当前节点 temp 插入到 node.next
- 返回 prehead.next 即可
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head==null || head.next == null) {
return head;
}
ListNode prehead = new ListNode(0);
prehead.next = head;
ListNode node = prehead;
//将node移至需要反转的前一个节点
for(int i=1; i<m; i++) {
node = node.next;
}
//cur为需要反转的第一个节点,在接下来的遍历中所指向的节点保持不变
ListNode cur = node.next;
for(int i=m; i<n; i++) {
ListNode temp = cur.next; //当前需要反转的节点
cur.next = temp.next;
temp.next = node.next;
node.next = temp;
}
return prehead.next;
}
}