每日一题:k链表翻转

这是一道关于链表操作的编程题,要求根据给定的链表和整数k,翻转链表的每k个节点。例如,对于链表1→2→3→4→5→6和k=2,翻转后的链表为2→1→4→3→6→5。文章提供了非递归的解决方案,并提示有更多大厂面试题资源可供下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现。

答案:

非递归可运行代码:

 typedef struct node {
    struct node *next;
    int data;
} node;
void createList(node **head, int data)
{
    node *pre, *cur, *new;
    pre = NULL;
    cur = *head;
    while (cur != NULL) {
        pre = cur;
        cur = cur->next;
    }
    new = (node *)malloc(sizeof(node));
    new->data = data;
    new->next = cur;
    if (pre == NULL)
    *head = new;
    else
    pre->next = new;
}
void printLink(node *head)
{
    while (head->next != NULL) {
        printf(""%d "", head->data);
        head = head->next;
    }
    printf(""%dn"", head->data);
}
int linkLen(node *head)
{
    int len = 0;
    while (head != NULL) {
        len ++;
        head = head->next;
    }
    return len;
}
node* reverseK(node *head, int k)
{
    int i, len, time, now;
    len = linkLen(head);
    if (len < k) {
        return head;
        } else {
        time = len / k;
    }
    node *newhead, *prev, *next, *old, *tail;
    for (now = 0, tail = NULL; now < time; now ++) {
        old = head;
        for (i = 0, prev = NULL; i < k; i ++) {
            next = head->next;
            head->next = prev;
            prev = head;
            head = next;
        }
        if (now == 0) {
            newhead = prev;
        }
        old->next = head;
        if (tail != NULL) {
            tail->next = prev;
        }
        tail = old;
    }
    if (head != NULL) {
        tail->next = head;
    }
    return newhead;
}
int main(void)
{
    int i, n, k, data;
    node *head, *newhead;
    while (scanf(""%d %d"", &n, &k) != EOF) {
        for (i = 0, head = NULL; i < n; i ++) {
            scanf(""%d"", &data);
            createList(&head, data);
        }
        printLink(head);
        newhead = reverseK(head, k);
        printLink(newhead);
    }
    return 0;
}

如果对你有帮助可以关注我,还整理了很多大厂面试题,不定期发布到这里https://download.youkuaiyun.com/user/weixin_39813541/uploads需要可以下载,都附有答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值