📅  最后修改于: 2023-12-03 15:22:27.544000             🧑  作者: Mango
在链表中,有时我们需要将链表中的中间节点作为新的头部来操作,本文将给出实现这个功能的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;
}
代码分析:
定义链表节点结构体ListNode
,其中包括节点的值和指向下一个节点的指针。
定义middleNode
函数,使用快慢指针找到链表的中间节点,并将其作为函数的返回值。
在main
函数中,手动构建一个包含三个节点的链表。
输出链表中各个节点的值。
调用middleNode
函数找到链表中间节点。
将中间节点的next
指针置为空,表示新链表已经结束。
找到新链表的尾节点,并将尾节点的next
指向原链表的头部节点。
输出新链表中各个节点的值。
程序运行结果如下:
before:
1 2 3
after:
2 3 1
可以看到,原链表是1 -> 2 -> 3
,运行程序后,将中间节点2
作为新的头部节点,生成的链表是2 -> 3 -> 1
。