数据结构,删除链表倒数第n个节点,并返回新的头节点

哈哈哈哈哈哈

//设总节点数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;
}

运行结果

相关推荐
一米阳光86612 分钟前
软考(中级)软件设计师核心笔记(8)数据结构——树与二叉树
数据结构·笔记·职场发展·软考·软件设计师·中级职称
依然鸣21 分钟前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
imaol11 小时前
数据结构--树
数据结构
Tongzhi20261 小时前
通芝科技无感考勤一体机:软硬一体,开箱即用
数据结构·数据库·科技·算法·均值算法·数据库开发
linux-hzh3 小时前
百日算法修炼 · Day 09
数据结构·算法·排序算法
淡海水3 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
一米阳光86615 小时前
软考(中级)软件设计师核心笔记(8)数据结构——图
数据结构·笔记·职场发展·软考·软件设计师·中级职称
wabs66617 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
imaol118 小时前
链表 -- 环链表
java·前端·链表
wuyk55518 小时前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机