反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。
說明:1 ≤ m ≤ n ≤ 鍊錶長度。
示例:輸入: 1->2->3->4->5->null, m = 2, n = 4
輸出: 1->4->3->2->5->null
解題思路:
1、構造乙個dummy節點 指向頭結點,為了可以在頭節點指標發生變化的時候,直接用dummy->next定位到頭節點,如下:
dummy->1->2->3->4->5->null
2、利用m定位到開始節點的 前乙個節點。m=2時,則操作 2那個節點。則前乙個 previous 節點值為1
3、規定此時 1節點為previous節點,2節點為cur_operator_node,cur_operator_node->next即3節點是temp節點
4、斷開cur_operator_node和temp的連線關係,即2和3的連線, 變更cur_operator_node->next = temp->next,即為2指向4。
斷開temp和temp->next的連線關係,即3和4的連線關係,變更為temp->next = previous->next,即3指向2。
斷開previous和previous->next的連線關係,即1和2的連線關係,變更為 previous->next=temp,即1指向3。
至此完成了3節點逆置,新的鍊錶如下:
dummy->1->3->2->4->5->null
5、此時1節點仍然是previous節點,2節點仍然是cur_operator_node,cur_operator_node->next即4節點是temp節點
6、按照4的步驟:
斷開cur_operator_node和temp的連線關係,即2和4的連線,變更cur_operator_node->next = temp->next,即為2指向5。
斷開temp和temp->next的連線關係,即4和5的連線關係,變更為temp->next = previous->next,即4指向3。
斷開previous和previous->next的連線關係,即1和3的連線關係,變更為 previous->next=temp,即1指向4。
至此完成了4節點逆置,新的鍊錶如下:
dummy->1->4->3->2->5->null
完成逆轉。返回節點頭即dummy->next。
即使m=1,1節點為cur_operator_node也成立,因為previous節點存在,是dummy。
**如下:
struct node ;
node* reverse_with_range(node* head, int m, int n) ;
dummy.next = head;
auto previous = &dummy;
for (int i = 1; i < m; ++i)
auto cur_operator_node = previous->next;
for (int i = 0; i < n - m ; i++)
return dummy.next;
}
leetcode 92反轉鍊錶
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null definition for singly linked list.public class listnode class...
LeetCode 92 反轉鍊錶 II
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null 5ms definition for singly linked list.public class listnode c...
leetcode92 反轉鍊錶 II
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 null思路 先往後遍歷找到需要反轉的節點作為起點 count m 然後按照劍指offer 反轉鍊錶 的思路,設定curr,pre,p...