设计一个算法,给一个链表 删除链表倒数第i个节点,并且返回链表的头结点用C语言
时间: 2024-09-29 09:15:47 浏览: 71
设计一个算法删除链表倒数第 i 个节点,可以分为以下几个步骤:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建新链表节点函数
ListNode* createNode(int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (newNode != NULL) {
newNode->val = data;
newNode->next = NULL;
}
return newNode;
}
// 删除倒数第 i 个节点的辅助函数,避免直接访问元素导致错误
ListNode* deleteLastIthNode(ListNode* head, int i) {
if (head == NULL || i <= 0)
return head; // 如果链表为空或 i 不合法,直接返回
ListNode* current = head;
ListNode* prev = NULL;
// 遍历链表找到第 i - 1 个节点
for (int j = 1; j < i && current != NULL; ++j) {
prev = current;
current = current->next;
}
// 如果遍历到链表尾部还没找到第 i 个节点,则不需要删除任何东西
if (current == NULL)
return head;
// 删除第 i 个节点
prev->next = current->next;
return head;
}
// 打印链表帮助测试
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 示例:给定链表 1->2->3->4->5 和 i=2,结果应为 1->2->4->5
ListNode* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
head->next->next->next->next = createNode(5);
head = deleteLastIthNode(head, 2); // 删除倒数第二个节点
printList(head); // 输出处理后的链表
return 0;
}
```
这个算法首先创建一个新链表节点,然后通过遍历链表找到倒数第 i 个节点的前一个节点,将前一个节点的 `next` 指针指向当前节点的下一个节点,从而达到删除目标节点的效果。
阅读全文