How to Delete N Nodes After M Nodes of a Linked List?

  • 时间:2020-09-08 11:19:41
  • 分类:网络文摘
  • 阅读:109 次

Given the head of a linked list and two integers m and n. Traverse the linked list and remove some nodes in the following way:

Start with the head as the current node.
Keep the first m nodes starting with the current node.
Remove the next n nodes
Keep repeating steps 2 and 3 until you reach the end of the list.
Return the head of the modified list after removing the mentioned nodes.

Follow up question: How can you solve this problem by modifying the list in-place?

delete-n-nodes-after-m-nodes-of-a-linked-list How to Delete N Nodes After M Nodes of a Linked List? algorithms c / c++ data structure

delete-n-nodes-after-m-nodes-of-a-linked-list

Example 1:
Input: head = [1,2,3,4,5,6,7,8,9,10,11,12,13], m = 2, n = 3
Output: [1,2,6,7,11,12]
Explanation: Keep the first (m = 2) nodes starting from the head of the linked List (1 ->2) show in black nodes.
Delete the next (n = 3) nodes (3 -> 4 -> 5) show in read nodes.
Continue with the same procedure until reaching the tail of the Linked List.
Head of linked list after removing nodes is returned.

Example 2:
Input: head = [1,2,3,4,5,6,7,8,9,10,11], m = 1, n = 3
Output: [1,5,9]
Explanation: Head of linked list after removing nodes is returned.

Example 3:
Input: head = [1,2,3,4,5,6,7,8,9,10,11], m = 3, n = 1
Output: [1,2,3,5,6,7,9,10,11]

Example 4:
Input: head = [9,3,7,7,9,10,8,2], m = 1, n = 2
Output: [9,7,8]

Constraints:
The given linked list will contain between 1 and 10^4 nodes.
The value of each node in the linked list will be in the range [1, 10^6].
1 <= m,n <= 1000

Hints:
Traverse the Linked List, each time you need to delete the next n nodes connect the nodes previous deleting with the next node after deleting.

C++ Algorithm to Delete N Nodes After M Nodes of a Linked List in Place

Most linked list problems can be helped by using a dummy header pointer. In this particular problem, we need also a previous pointer. By skipping current M nodes, and we need to link the previous pointer to next pointer – which basically delete N nodes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * 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* dummy = new ListNode(-1);
        ListNode* prev = dummy;
        prev->next = head;
        while (head != NULL) {         
            for (int i = 0; (i < m) && (head != NULL); ++ i) {
                prev = head;
                head = head->next;
            }
            for (int i = 0; (i < n) && (head != NULL); ++ i) {
                head = head->next;
            }            
            prev->next = head;
        }
        return dummy->next;
    }
};
/**
 * 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* dummy = new ListNode(-1);
        ListNode* prev = dummy;
        prev->next = head;
        while (head != NULL) {         
            for (int i = 0; (i < m) && (head != NULL); ++ i) {
                prev = head;
                head = head->next;
            }
            for (int i = 0; (i < n) && (head != NULL); ++ i) {
                head = head->next;
            }            
            prev->next = head;
        }
        return dummy->next;
    }
};

We also need to take care of the cases when there are less than M nodes to skip. In this case, we would just point previous pointer to NULL.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
How to Blog Like Shakespeare  Depth First Search Algorithm to Delete Insufficient Nodes in Roo  C/C++ Program to Compute the Angle Between Hands of a Clock  What Should Your Anti Virus Software Have in Order to Be Effecti  The Importance of SEO and How They Improve the Number of Your Cl  Learn The Basics Of Google My Business  Iterative and Recursion Algorithms to Compute the Number of Step  How to Check if a DLL or EXE is 32-bit or 64-bit (x86 or x64) us  C++: How to Iterate the Elements over the Sets (set, unordered_s  How to Iterate over the Items in Java’s Map (HashMap, Hash 
评论列表
添加评论