MST

星途 面试题库

面试题:C语言双向链表的复杂操作

用C语言实现一个双向链表,并编写函数实现以下功能:1. 逆序双向链表;2. 合并两个有序的双向链表为一个新的有序双向链表。请给出完整代码,包括双向链表节点的定义、基本操作(插入、删除等)以及上述两个功能的实现函数。双向链表节点结构体可定义为:struct DNode { int data; struct DNode* prev; struct DNode* next; }。
47.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>

// 双向链表节点定义
struct DNode {
    int data;
    struct DNode* prev;
    struct DNode* next;
};

// 创建新节点
struct DNode* createNode(int value) {
    struct DNode* newNode = (struct DNode*)malloc(sizeof(struct DNode));
    newNode->data = value;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

// 在链表头部插入节点
void insertAtHead(struct DNode** head, int value) {
    struct DNode* newNode = createNode(value);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    newNode->next = *head;
    (*head)->prev = newNode;
    *head = newNode;
}

// 删除指定节点
void deleteNode(struct DNode** head, struct DNode* delNode) {
    if (delNode == NULL) return;
    if (*head == delNode) {
        *head = delNode->next;
    }
    if (delNode->prev != NULL) {
        delNode->prev->next = delNode->next;
    }
    if (delNode->next != NULL) {
        delNode->next->prev = delNode->prev;
    }
    free(delNode);
}

// 逆序双向链表
void reverseDLL(struct DNode** head) {
    struct DNode* current = *head;
    struct DNode* temp = NULL;
    while (current != NULL) {
        temp = current->prev;
        current->prev = current->next;
        current->next = temp;
        current = current->prev;
    }
    if (temp != NULL) {
        *head = temp->prev;
    }
}

// 合并两个有序的双向链表为一个新的有序双向链表
struct DNode* mergeSortedDLL(struct DNode* head1, struct DNode* head2) {
    struct DNode dummy;
    dummy.prev = NULL;
    dummy.next = NULL;
    struct DNode* tail = &dummy;
    while (head1 != NULL && head2 != NULL) {
        if (head1->data <= head2->data) {
            tail->next = head1;
            head1->prev = tail;
            tail = head1;
            head1 = head1->next;
        } else {
            tail->next = head2;
            head2->prev = tail;
            tail = head2;
            head2 = head2->next;
        }
    }
    if (head1 != NULL) {
        tail->next = head1;
        head1->prev = tail;
    }
    if (head2 != NULL) {
        tail->next = head2;
        head2->prev = tail;
    }
    return dummy.next;
}

// 打印双向链表
void printDLL(struct DNode* head) {
    struct DNode* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    struct DNode* head1 = NULL;
    struct DNode* head2 = NULL;

    insertAtHead(&head1, 1);
    insertAtHead(&head1, 3);
    insertAtHead(&head1, 5);

    insertAtHead(&head2, 2);
    insertAtHead(&head2, 4);
    insertAtHead(&head2, 6);

    printf("链表1: ");
    printDLL(head1);

    printf("链表2: ");
    printDLL(head2);

    struct DNode* mergedHead = mergeSortedDLL(head1, head2);
    printf("合并后的有序链表: ");
    printDLL(mergedHead);

    reverseDLL(&mergedHead);
    printf("逆序后的链表: ");
    printDLL(mergedHead);

    return 0;
}