1. 程式人生 > 其它 >力扣 1474. 刪除連結串列 M 個節點之後的 N 個節點

力扣 1474. 刪除連結串列 M 個節點之後的 N 個節點

技術標籤:力扣刷題

給定連結串列 head 和兩個整數 m 和 n. 遍歷該連結串列並按照如下方式刪除節點:

開始時以頭節點作為當前節點.
保留以當前節點開始的前 m 個節點.
刪除接下來的 n 個節點.
重複步驟 2 和 3, 直到到達連結串列結尾.
在刪除了指定結點之後, 返回修改過後的連結串列的頭節點.

進階問題: 你能通過就地修改連結串列的方式解決這個問題嗎?

示例 1:

在這裡插入圖片描述

輸入: head = [1,2,3,4,5,6,7,8,9,10,11,12,13], m = 2, n = 3
輸出: [1,2,6,7,11,12]
解析: 保留前(m = 2)個結點, 也就是以黑色節點表示的從連結串列頭結點開始的結點(1 ->2).

刪除接下來的(n = 3)個結點(3 -> 4 -> 5), 在圖中以紅色結點表示.
繼續相同的操作, 直到連結串列的末尾.
返回刪除結點之後的連結串列的頭結點.
示例 2:

在這裡插入圖片描述

輸入: head = [1,2,3,4,5,6,7,8,9,10,11], m = 1, n = 3
輸出: [1,5,9]
解析: 返回刪除結點之後的連結串列的頭結點.
示例 3:

輸入: head = [1,2,3,4,5,6,7,8,9,10,11], m = 3, n = 1
輸出: [1,2,3,5,6,7,9,10,11]
示例 4:

輸入: head = [9,3,7,7,9,10,8,2], m = 1, n = 2

輸出: [9,7,8]

提示:

1 <= 連結串列結點數 <= 10^4.
[1 <= 連結串列的每一個結點值 <=10^6].
1 <= m,n <= 1000

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution { public: ListNode* deleteNodes(ListNode* head, int m, int n) { ListNode* p=head; int lm=1,ln=0; while(p&&p->next){ if(lm<m){ p=p->next; lm++; ln=0; } else{ if(ln==n){ lm=0; } else{ p->next=p->next->next; ln++; } } } return head; } };