📅  最后修改于: 2023-12-03 14:54:49.101000             🧑  作者: Mango
以下是问题 61 的解答,该问题是教资会网络(UGC NET)2015年12月份计算机科学和应用主题(第三部分)中的一个问题。
给定一个单链表的起始节点指针start
和一个整数n
,编写一个函数以删除链表中的第n
个节点,并返回删除后的链表的起始节点指针。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteNthNode(ListNode* start, int n) {
if (start == NULL) {
return NULL;
}
if (n == 0) {
return start->next;
}
ListNode* currentNode = start;
ListNode* previousNode = NULL;
int count = 0;
while (count < n) {
if (currentNode->next == NULL) {
return start;
}
previousNode = currentNode;
currentNode = currentNode->next;
count++;
}
if (previousNode == NULL) {
return start->next;
}
previousNode->next = currentNode->next;
return start;
}
上述代码实现了一个函数deleteNthNode
,该函数接受一个单链表的起始节点指针start
和一个整数n
作为输入参数。函数的作用是删除链表中的第n
个节点,并返回删除后的链表的起始节点指针。
代码首先检查起始节点指针start
是否为空,如果为空,则直接返回空指针作为结果。
接下来,需要对n
的值进行检查,如果n
等于0,则说明需要删除的是第一个节点,直接返回第一个节点的下一个节点作为结果。
然后,定义两个指针currentNode
和previousNode
,分别用于遍历和记录当前节点和上一个节点。
在循环中,首先检查currentNode
的下一个节点是否为空,如果为空,则说明已经到达链表的末尾,可以直接返回起始节点作为结果。
否则,将currentNode
赋值给previousNode
,将currentNode->next
赋值给currentNode
,从而向后遍历链表。
每遍历一次链表,计数器count
加1,当count
的值达到n
时,说明已经找到了要删除的节点。
如果previousNode
为空,说明要删除的是第一个节点,直接返回第二个节点作为结果。
否则,将previousNode
的下一个节点指针指向currentNode
的下一个节点,从而删除currentNode
。
最后,返回起始节点作为结果。
这种算法的时间复杂度是线性的,与链表的长度成正比,即为O(n)。
请注意,上述代码提供的是C++语言版本的解答,您可以根据需要进行修改和适应其他编程语言。