c语言编程实现已知带头结点单链表L,编写函数删除倒数第k个结点,删除成功函数返回1,否则返回0
时间: 2024-11-17 09:30:13 浏览: 31
在 C 语言中,实现删除单链表 L 中倒数第 k 个节点,需要考虑到链表长度不确定的情况,以及当 k 大于链表长度时的情况。这里提供一种常见的递归解决方案:
首先,我们需要定义链表结构体 `ListNode` 和一些辅助函数:
```c
// 定义链表节点结构
typedef struct ListNode {
int val; // 节点值
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 删除链表中的倒数第 k 个节点
int removeKthFromEnd(ListNode* head, int k) {
if (!head || !head->next) { // 链表为空或只有一个节点
return (k == 1) ? 0 : -1; // 如果 k 等于 1,则直接返回 0 或 -1 表示失败
}
// 使用两个指针,快慢指针,快指针每次走两步,慢指针每次走一步
ListNode* slow = head;
ListNode* fast = head->next;
// 让快指针走到链表末尾
for (int i = 1; fast && fast->next; ++i) {
fast = fast->next->next;
}
// 如果 k > 链表长度,返回 0,表示删除失败
if (!fast || k > i + 1) {
return 0;
}
// 从头开始,慢指针每移动一次,快指针就前移 k - 1 次,直到找到倒数第 k 个节点
while (k--) {
fast = fast->prev;
}
// 删除找到的节点,将前一个节点的 next 指针指向下一个节点
ListNode* temp = slow->prev;
if (temp) {
temp->next = slow->next;
} else { // 如果是头节点,头指针直接指向下一个节点
head = slow->next;
}
free(slow); // 释放被删除节点的内存
return 1; // 删除成功,返回 1
}
```
在这个函数里,我们通过快慢指针定位到倒数第 k 个节点,然后删除它。需要注意的是,如果链表长度小于 k,或者 k 等于链表长度,这个操作无法完成,此时返回 0 表示失败。
阅读全文