📌  相关文章
📜  使链表中的中间节点成为头部的 C 程序(1)

📅  最后修改于: 2023-12-03 15:22:27.544000             🧑  作者: Mango

使链表中的中间节点成为头部的C程序

在链表中,有时我们需要将链表中的中间节点作为新的头部来操作,本文将给出实现这个功能的C语言程序。

实现思路

我们可以使用两个指针来遍历链表。第一个指针每次移动一个节点,第二个指针每次移动两个节点。当第二个指针到达链表末尾时,第一个指针所在的位置就是链表中间节点的位置,我们可以将其作为新的头部节点。

代码实现

下面是实现将链表中的中间节点作为新的头部的C语言程序:

#include<stdio.h>
#include<stdlib.h>

typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

ListNode *middleNode(ListNode *head) {
    ListNode *p = head, *q = head;
    while (q && q->next) {
        p = p->next;
        q = q->next->next;
    }
    return p;
}

int main() {
    ListNode *head = (ListNode *)malloc(sizeof(ListNode));
    head->val = 1;
    head->next = (ListNode *)malloc(sizeof(ListNode));
    head->next->val = 2;
    head->next->next = (ListNode *)malloc(sizeof(ListNode));
    head->next->next->val = 3;
    head->next->next->next = NULL;

    printf("before:\n");
    ListNode *p = head;
    while (p) {
        printf("%d ", p->val);
        p = p->next;
    }

    ListNode *midNode = middleNode(head);
    ListNode *newHead = midNode->next;
    midNode->next = NULL;
    ListNode *p1 = newHead;
    while (p1->next) {
        p1 = p1->next;
    }
    p1->next = head;

    printf("\nafter:\n");
    p = newHead;
    while (p) {
        printf("%d ", p->val);
        p = p->next;
    }

    return 0;
}

代码分析:

  1. 定义链表节点结构体ListNode,其中包括节点的值和指向下一个节点的指针。

  2. 定义middleNode函数,使用快慢指针找到链表的中间节点,并将其作为函数的返回值。

  3. main函数中,手动构建一个包含三个节点的链表。

  4. 输出链表中各个节点的值。

  5. 调用middleNode函数找到链表中间节点。

  6. 将中间节点的next指针置为空,表示新链表已经结束。

  7. 找到新链表的尾节点,并将尾节点的next指向原链表的头部节点。

  8. 输出新链表中各个节点的值。

运行结果

程序运行结果如下:

before:
1 2 3
after:
2 3 1

可以看到,原链表是1 -> 2 -> 3,运行程序后,将中间节点2作为新的头部节点,生成的链表是2 -> 3 -> 1