📌  相关文章
📜  用于交替拆分给定单链表的 C 程序 - 集 1(1)

📅  最后修改于: 2023-12-03 14:56:19.105000             🧑  作者: Mango

用于交替拆分给定单链表的 C 程序 - 集 1

在本文中,我们将介绍一个用于交替拆分给定单链表的 C 程序。这个程序可以将单链表按照指定的顺序拆分成两个新的单链表。

程序设计

此 C 程序的基本思路是遍历原始单链表,然后根据需要将节点添加到结果链表中。整个过程可以通过循环来处理。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* oddEvenList(struct ListNode* head){
    if(head == NULL || head->next == NULL)  // 若给定链表为空或只有一个节点,则直接返回原链表
        return head;
    struct ListNode* odd = head;             // 指向奇数节点链表的指针
    struct ListNode* even = head->next;      // 指向偶数节点链表的指针
    struct ListNode* evenHead = even;        // 指向偶数节点链表头部的指针
    while(even != NULL && even->next != NULL){  // 循环操作交替添加
        odd->next = even->next;
        odd = odd->next;
        even->next = odd->next;
        even = even->next;
    }
    odd->next = evenHead;       // 将偶数节点链表插入到奇数节点链表的尾节点
    return head;
}
程序分析

该 C 程序的核心部分是一个 while 循环,它的条件是偶数节点链表的指针不为空,且其下一个节点不为空。在每次循环迭代中,程序都会从奇数节点链表和偶数节点链表中依次取一个节点,并将它们添加到结果链表中。最后,将偶数节点链表添加到奇数节点链表的末尾,返回结果链表。

需要注意的是,由于我们需要交替处理奇数节点和偶数节点,因此我们需要使用两个指针来分别指向奇数节点链表和偶数节点链表的头部。我们还需要一个指针来标记偶数节点链表的头部,便于将其添加到奇数节点链表的末尾。