删除链表M个节点后的N个节点
给定一个链表和两个整数 M 和 N。遍历链表,保留 M 个节点,然后删除接下来的 N 个节点,继续相同直到链表结束。
难度等级:菜鸟
例子:
Input:
M = 2, N = 2
Linked List: 1->2->3->4->5->6->7->8
Output:
Linked List: 1->2->5->6
Input:
M = 3, N = 2
Linked List: 1->2->3->4->5->6->7->8->9->10
Output:
Linked List: 1->2->3->6->7->8
Input:
M = 1, N = 1
Linked List: 1->2->3->4->5->6->7->8->9->10
Output:
Linked List: 1->3->5->7->9
问题的主要部分是保持节点之间的正确链接,确保处理所有极端情况。以下是函数skipMdeleteN() 的 C 实现,它跳过 M 个节点并删除 N 个节点直到列表末尾。假设 M 不能为 0。
C++
// C++ program to delete N nodes
// after M nodes of a linked list
#include
using namespace std;
// A linked list node
class Node
{
public:
int data;
Node *next;
};
/* Function to insert a node at the beginning */
void push(Node ** head_ref, int new_data)
{
/* allocate node */
Node* new_node = new Node();
/* put in the data */
new_node->data = new_data;
/* link the old list off the new node */
new_node->next = (*head_ref);
/* move the head to point to the new node */
(*head_ref) = new_node;
}
/* Function to print linked list */
void printList(Node *head)
{
Node *temp = head;
while (temp != NULL)
{
cout<data<<" ";
temp = temp->next;
}
cout<next;
// If we reached end of list, then return
if (curr == NULL)
return;
// Start from next node and delete N nodes
t = curr->next;
for (count = 1; count<=N && t!= NULL; count++)
{
Node *temp = t;
t = t->next;
free(temp);
}
// Link the previous list with remaining nodes
curr->next = t;
// Set current pointer for next iteration
curr = t;
}
}
// Driver code
int main()
{
/* Create following linked list
1->2->3->4->5->6->7->8->9->10 */
Node* head = NULL;
int M=2, N=3;
push(&head, 10);
push(&head, 9);
push(&head, 8);
push(&head, 7);
push(&head, 6);
push(&head, 5);
push(&head, 4);
push(&head, 3);
push(&head, 2);
push(&head, 1);
cout << "M = " << M<< " N = " << N << "\nGiven Linked list is :\n";
printList(head);
skipMdeleteN(head, M, N);
cout<<"\nLinked list after deletion is :\n";
printList(head);
return 0;
}
// This code is contributed by rathbhupendra
C
// C program to delete N nodes after M nodes of a linked list
#include
#include
// A linked list node
struct Node
{
int data;
struct Node *next;
};
/* Function to insert a node at the beginning */
void push(struct Node ** head_ref, int new_data)
{
/* allocate node */
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
/* put in the data */
new_node->data = new_data;
/* link the old list off the new node */
new_node->next = (*head_ref);
/* move the head to point to the new node */
(*head_ref) = new_node;
}
/* Function to print linked list */
void printList(struct Node *head)
{
struct Node *temp = head;
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// Function to skip M nodes and then delete N nodes of the linked list.
void skipMdeleteN(struct Node *head, int M, int N)
{
struct Node *curr = head, *t;
int count;
// The main loop that traverses through the whole list
while (curr)
{
// Skip M nodes
for (count = 1; countnext;
// If we reached end of list, then return
if (curr == NULL)
return;
// Start from next node and delete N nodes
t = curr->next;
for (count = 1; count<=N && t!= NULL; count++)
{
struct Node *temp = t;
t = t->next;
free(temp);
}
curr->next = t; // Link the previous list with remaining nodes
// Set current pointer for next iteration
curr = t;
}
}
// Driver program to test above functions
int main()
{
/* Create following linked list
1->2->3->4->5->6->7->8->9->10 */
struct Node* head = NULL;
int M=2, N=3;
push(&head, 10);
push(&head, 9);
push(&head, 8);
push(&head, 7);
push(&head, 6);
push(&head, 5);
push(&head, 4);
push(&head, 3);
push(&head, 2);
push(&head, 1);
printf("M = %d, N = %d \nGiven Linked list is :\n", M, N);
printList(head);
skipMdeleteN(head, M, N);
printf("\nLinked list after deletion is :\n");
printList(head);
return 0;
}
Java
// Java program to delete N nodes
// after M nodes of a linked list
import java.util.*;
class GFG
{
// A linked list node
static class Node
{
int data;
Node next;
};
/* Function to insert a node at the beginning */
static Node push( Node head_ref, int new_data)
{
/* allocate node */
Node new_node = new Node();
/* put in the data */
new_node.data = new_data;
/* link the old list off the new node */
new_node.next = (head_ref);
/* move the head to point to the new node */
(head_ref) = new_node;
return head_ref;
}
/* Function to print linked list */
static void printList( Node head)
{
Node temp = head;
while (temp != null)
{
System.out.printf("%d ", temp.data);
temp = temp.next;
}
System.out.printf("\n");
}
// Function to skip M nodes and then
// delete N nodes of the linked list.
static void skipMdeleteN( Node head, int M, int N)
{
Node curr = head, t;
int count;
// The main loop that traverses
// through the whole list
while (curr!=null)
{
// Skip M nodes
for (count = 1; count < M && curr != null; count++)
curr = curr.next;
// If we reached end of list, then return
if (curr == null)
return;
// Start from next node and delete N nodes
t = curr.next;
for (count = 1; count <= N && t != null; count++)
{
Node temp = t;
t = t.next;
}
// Link the previous list with remaining nodes
curr.next = t;
// Set current pointer for next iteration
curr = t;
}
}
// Driver code
public static void main(String args[])
{
/* Create following linked list
1.2.3.4.5.6.7.8.9.10 */
Node head = null;
int M=2, N=3;
head=push(head, 10);
head=push(head, 9);
head=push(head, 8);
head=push(head, 7);
head=push(head, 6);
head=push(head, 5);
head=push(head, 4);
head=push(head, 3);
head=push(head, 2);
head=push(head, 1);
System.out.printf("M = %d, N = %d \nGiven" +
"Linked list is :\n", M, N);
printList(head);
skipMdeleteN(head, M, N);
System.out.printf("\nLinked list after deletion is :\n");
printList(head);
}
}
// This code is contributed by Arnab Kundu
Python
# Python program to delete M nodes after N nodes
# Node class
class Node:
# Constructor to initialize the node object
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
# Function to initialize head
def __init__(self):
self.head = None
# Function to insert a new node at the beginning
def push(self, new_data):
new_node = Node(new_data)
new_node.next = self.head
self.head = new_node
# Utility function to prit the linked LinkedList
def printList(self):
temp = self.head
while(temp):
print temp.data,
temp = temp.next
def skipMdeleteN(self, M, N):
curr = self.head
# The main loop that traverses through the
# whole list
while(curr):
# Skip M nodes
for count in range(1, M):
if curr is None:
return
curr = curr.next
if curr is None :
return
# Start from next node and delete N nodes
t = curr.next
for count in range(1, N+1):
if t is None:
break
t = t.next
# Link the previous list with reamining nodes
curr.next = t
# Set Current pointer for next iteration
curr = t
# Driver program to test above function
# Create following linked list
# 1->2->3->4->5->6->7->8->9->10
llist = LinkedList()
M = 2
N = 3
llist.push(10)
llist.push(9)
llist.push(8)
llist.push(7)
llist.push(6)
llist.push(5)
llist.push(4)
llist.push(3)
llist.push(2)
llist.push(1)
print "M = %d, N = %d\nGiven Linked List is:" %(M, N)
llist.printList()
print
llist.skipMdeleteN(M, N)
print "\nLinked list after deletion is"
llist.printList()
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)
C#
// C# program to delete N nodes
// after M nodes of a linked list
using System;
class GFG
{
// A linked list node
public class Node
{
public int data;
public Node next;
};
/* Function to insert a node at the beginning */
static Node push( Node head_ref, int new_data)
{
/* allocate node */
Node new_node = new Node();
/* put in the data */
new_node.data = new_data;
/* link the old list off the new node */
new_node.next = (head_ref);
/* move the head to point to the new node */
(head_ref) = new_node;
return head_ref;
}
/* Function to print linked list */
static void printList( Node head)
{
Node temp = head;
while (temp != null)
{
Console.Write("{0} ", temp.data);
temp = temp.next;
}
Console.Write("\n");
}
// Function to skip M nodes and then
// delete N nodes of the linked list.
static void skipMdeleteN( Node head, int M, int N)
{
Node curr = head, t;
int count;
// The main loop that traverses
// through the whole list
while (curr!=null)
{
// Skip M nodes
for (count = 1; count < M &&
curr != null; count++)
curr = curr.next;
// If we reached end of list, then return
if (curr == null)
return;
// Start from next node and delete N nodes
t = curr.next;
for (count = 1; count <= N && t != null; count++)
{
Node temp = t;
t = t.next;
}
// Link the previous list with remaining nodes
curr.next = t;
// Set current pointer for next iteration
curr = t;
}
}
// Driver code
public static void Main(String []args)
{
/* Create following linked list
1.2.3.4.5.6.7.8.9.10 */
Node head = null;
int M=2, N=3;
head=push(head, 10);
head=push(head, 9);
head=push(head, 8);
head=push(head, 7);
head=push(head, 6);
head=push(head, 5);
head=push(head, 4);
head=push(head, 3);
head=push(head, 2);
head=push(head, 1);
Console.Write("M = {0}, N = {1} \nGiven" +
"Linked list is :\n", M, N);
printList(head);
skipMdeleteN(head, M, N);
Console.Write("\nLinked list after deletion is :\n");
printList(head);
}
}
// This code contributed by Rajput-Ji
Javascript
输出:
M = 2, N = 3
Given Linked list is :
1 2 3 4 5 6 7 8 9 10
Linked list after deletion is :
1 2 6 7
时间复杂度: O(n),其中 n 是链表中的节点数。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。