📅  最后修改于: 2023-12-03 15:25:20.542000             🧑  作者: Mango
在链表中,有时需要将最后一个元素移动到链表的前面。这个操作可以通过对链表进行遍历和重组来实现。下面是一个 C 程序,用来实现这个操作。
#include <stdio.h>
#include <stdlib.h>
/* 定义节点结构体 */
struct node {
int data;
struct node *next;
};
/* 将最后一个节点移到链表的前面 */
struct node* moveToEndToFront(struct node* head) {
struct node *tail, *second_last;
/* 检查链表为空的情况 */
if (head == NULL || head->next == NULL) {
return head;
}
/* 找到最后一个节点和它的前一个节点 */
tail = head;
second_last = NULL;
while (tail->next != NULL) {
second_last = tail;
tail = tail->next;
}
/* 将最后一个节点移到链表的前面 */
second_last->next = NULL;
tail->next = head;
head = tail;
return head;
}
/* 打印链表 */
void printList(struct node *node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
/* 主函数 */
int main() {
struct node *head = NULL;
/* 初始化链表 */
head = (struct node*) malloc(sizeof(struct node));
head->data = 1;
head->next = (struct node*) malloc(sizeof(struct node));
head->next->data = 2;
head->next->next = (struct node*) malloc(sizeof(struct node));
head->next->next->data = 3;
head->next->next->next = NULL;
printf("移动前的链表: ");
printList(head);
head = moveToEndToFront(head);
printf("\n移动后的链表: ");
printList(head);
return 0;
}
该程序使用了链表数据结构,通过定义一个结构体来表示节点。节点包含两个字段,一个是数据(data),另一个是指向下一个节点的指针(next)。
在 moveToEndToFront
函数中,程序首先对链表进行了空值检查。如果链表为空,或者链表中只有一个元素,那么函数直接返回链表头。
接下来,程序遍历了链表,找到了最后一个节点和它的前一个节点。为了方便后续操作,程序将最后一个节点从链表中删除,并将其指针指向头节点。最后,程序将最后一个节点插入到头位置,完成了将最后一个节点移到链表前面的操作。
最后,在 main
函数中,程序创建了一个链表,并调用 moveToEndToFront
函数将最后一个节点移到了链表前面,并使用 printList
函数打印出移动前后的链表。