📌  相关文章
📜  将最后一个元素移动到给定链表前面的 C 程序(1)

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

将最后一个元素移动到给定链表前面的 C 程序

在链表中,有时需要将最后一个元素移动到链表的前面。这个操作可以通过对链表进行遍历和重组来实现。下面是一个 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 函数打印出移动前后的链表。