📌  相关文章
📜  用于分离链表中偶数和奇数节点的 C 程序(1)

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

用于分离链表中偶数和奇数节点的 C 程序

此程序实现的功能是对给定的链表进行分离,将其中所有奇数节点移动到链表前端,偶数节点移动到链表后端。

实现思路
  1. 定义两个指针,分别指向链表的前端和后端,以及一个临时指针用于遍历链表。

  2. 初始化前后指针:

    struct ListNode *evenHead = head->next;
    struct ListNode *oddHead = head;
    

    这一步的目的是让 evenHead 指向链表中第一个偶数节点,oddHead 指向链表中第一个奇数节点。

  3. 遍历链表,将所有奇数节点插入到 oddHead 后面,偶数节点插入到 evenHead 后面:

    while (temp) {
        if (temp->val % 2 == 0) {
            evenHead->next = temp;
            evenHead = evenHead->next;
        } else {
            oddHead->next = temp;
            oddHead = oddHead->next;
        }
        temp = temp->next;
    }
    
  4. 将最后一个节点的 next 指针置为 NULL:

    evenHead->next = NULL;
    oddHead->next = head->next;
    

    这一步的目的是让 evenHead 和 oddHead 对应的指针指向链表的最后一个节点,并将链表的尾节点的 next 指针置为 NULL。

代码实现
struct ListNode* oddEvenList(struct ListNode* head){
    if (head == NULL || head->next == NULL) {
        return head;
    }
    
    struct ListNode *evenHead = head->next;
    struct ListNode *oddHead = head;
    struct ListNode *temp = head->next->next;
    
    while (temp) {
        if (temp->val % 2 == 0) {
            evenHead->next = temp;
            evenHead = evenHead->next;
        } else {
            oddHead->next = temp;
            oddHead = oddHead->next;
        }
        temp = temp->next;
    }
    
    evenHead->next = NULL;
    oddHead->next = head->next;
    
    return head;
}
总结

此程序实现了对链表的简单操作,即将链表中的奇数节点和偶数节点分别移动到链表的前端和后端。需要注意的是,遍历链表时需要用一个临时指针来遍历整个链表,而且最后一定要将链表的尾节点的 next 指针置为 NULL,否则可能会出现链表出错的情况。