用c实现删除链表倒数第n个
时间: 2024-11-03 12:16:24 浏览: 20
在 C 语言中,删除链表中的倒数第 n 个元素需要一些技巧,因为直接访问或修改链表中的特定位置相对复杂。这里是一个常见的解决方案,通常采用双指针法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 删除倒数第 n 个节点的函数
Node* deleteNthFromEnd(Node* head, int n) {
if (head == NULL || n <= 0) return head; // 如果链表为空或 n 小于等于 0,直接返回
Node* slow = head; // 慢指针,每次移动一步
Node* fast = head; // 快指针,每次移动两步
for (int i = 0; i < n - 1; i++) {
if (fast != NULL) {
fast = fast->next;
}
if (fast == NULL) { // 如果快指针到达了末尾,说明链表长度小于 n,无法删除
return head;
}
}
while (fast != NULL) { // 当快指针到达倒数第 n 个节点时,慢指针还在第 n-1 个位置
slow = slow->next;
fast = fast->next;
}
if (slow == NULL) { // 如果快指针已经到了尾部,说明链表只剩一个元素,移除它
head = head->next;
} else {
slow->next = slow->next->next; // 跳过倒数第 n 个节点,指向下一个节点
}
return head;
}
// 测试函数
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
Node* list = createList(); // 假设已经有了一个链表,创建函数自行编写
int n = 2; // 假设我们要删除倒数第二个节点
list = deleteNthFromEnd(list, n);
printList(list); // 打印处理后的链表
return 0;
}
```
在这个示例中,`deleteNthFromEnd` 函数首先定位到倒数第 n 个节点,然后更新节点连接,使得这个节点被忽略。
阅读全文