哈哈哈哈哈哈
//设总节点数x个
//需要让1号节点遍历到
//最后一个节点时,二号节点遍历到要删除节点前一个
//1,2号节点开始都指向新的头节点,
//由于代码中新加了个头节点
//1号需要走到x+1位置,需要移动x次
//first=first->next;
//2号需要走到正序的(1+x)-n个节点位置,就是删除节点前一个
//就需要走x-n次
//second=second->next;
//先让1号节点走1号节点要走的次数减去二号要走的次数
//x-(x-n) = n次;
//然后1号2号只需要走相同的次数就
//能到达相同目标了
// 删除倒数第 n 个节点
bash
#include <stdio.h>
#include <stdlib.h>
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;
}
//设总节点数x个
//需要让1号节点遍历到
//最后一个节点时,二号节点遍历到要删除节点前一个
//1,2号节点开始都指向新的头节点,
//由于代码中新加了个头节点
//1号需要走到x+1位置,需要移动x次
//first=first->next;
//2号需要走到正序的(1+x)-n个节点位置,就是删除节点前一个
//就需要走x-n次
//second=second->next;
//先让1号节点走1号节点要走的次数减去二号要走的次数
//x-(x-n) = n次;
//然后1号2号只需要走相同的次数就
//能到达相同目标了
// 删除倒数第 n 个节点
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == NULL) {
return NULL;
}
ListNode *dummy = (ListNode *)malloc(sizeof(ListNode));
dummy->next = head;
ListNode *first = dummy;
ListNode *second = dummy;
// 移动 first 指针 n 步,移动了n次
for (int i = 0; i < n; i++) {
first = first->next;
}
// 同时移动 first 和 second 指针,直到 first 到达链表末尾
while (first->next != NULL) {
first = first->next;
second = second->next;
}
// 删除 second 的下一个节点
ListNode *temp = second->next;
second->next = temp->next;
free(temp);
ListNode *result = dummy->next;
free(dummy);
return result;
}
// 打印链表
void printList(ListNode *head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建链表 1 -> 2 -> 3 -> 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);
printf("Original list: ");
printList(head);
int n = 2;
head = removeNthFromEnd(head, n);
printf("After removing the %d-th node from end: ", n);
printList(head);
return 0;
}
运行结果