/**************************************************************************
*
* 92. [Reverse Linked List II](https://leetcode.com/problems/reverse-linked-list-ii/)
*
* Given the head of a singly linked list and two integers left and right where left <= right,
* reverse the nodes of the list from position left to position right, and return the reversed list.
*
* Reverse a linked list from position left to right. Do it in one-pass.
* Note: 1 ≤ m ≤ n ≤ length of list.
*
* Example:
* Input: head = [1,2,3,4,5], left = 2, right = 4
* Output: [1,4,3,2,5]
*
*
**************************************************************************/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode NODE;
///
///
/// Approach 1: first inverse from left to right nodes ,then point right position
NODE *reverseBetween(NODE *head, int left, int right){
NODE dummy;
dummy.next = head;
NODE *pre = &dummy;//逆序区间的前面一个元素
for (int i = 1; i < left; i++)
pre = pre->next;
NODE *tail = pre->next; // 逆序后的最后一个元素
NODE *preIn = pre->next;//需要逆序元素的上一个节点
NODE *cur = preIn->next;//需要逆序的第二个元素
for (int i = left; i < right; i++) {
NODE *next = cur->next;
cur->next = preIn;
preIn = cur;
cur = next;
}
pre->next = preIn;
tail->next = cur;
return dummy.next;
}
///
///
/// Approach 2: one by one to reverse
NODE *reverseBetween(NODE *head, int left, int right){
NODE dummy;
dummy.next = head;
NODE *pre = &dummy;
for (int i = 1; i < left; i++)
pre = pre->next;
NODE *head2 = pre;
pre = pre->next;
NODE *cur = pre->next; //从逆序的第二个元素算
for (int i = left; i < right; i++) {
NODE *next = cur->next;
pre->next = next;
cur->next = head2->next;
head2->next = cur;
cur = next;
}
return dummy.next;
}
Approach 2:
为了处理边界m=1的情况,在链表前面挂载一个dummy节点。
代码的核心:
prev->next = cur->next;
cur->next = head2->next;
head2->next = cur;
cur = prev->next;
head2指针:反转序列的前一个节点(下标为 m 的前一个节点)
prev指针:开始反转的节点(指向下标为 m 的元素并在遍历中保持不变).
每次循环:head2的next指向当前cur,prev的next指向更新之后要处理的cur
画个图理解了一下,表示更加深刻了,请看我画的图:
根据题目给的Example画的
一句代码对应一张图,清晰明了程序的运行原理