LeetCode 328.奇偶链表

题目

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
题目链接

示例

示例1

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例2

输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL

说明

  • 应当保持奇数节点和偶数节点的相对顺序。
  • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

题目解答

显然应该使用双指针法解决,设置一个偶链表,一个奇链表,为了统一操作,需要设置头结点如下:

list odd, even;
odd = (list)malloc(sizeof(struct ListNode));
even = (list)malloc(sizeof(struct ListNode));
odd->next = head;
even->next = head;

在一次遍历中分别将不同的结点插入不同的链表。遍历结束后,再讲偶链表接在奇链表后。遍历过程如下:

int num = 1;
while (head != NULL){
    // 奇结点
    if (num % 2 == 1){
        odd_p->next = head;
        odd_p = odd_P->next;
    }else {
        even_p->next = head;
        even_p = even_p->next;
    }
    head = head->next;
    num++;
}

遍历结束后,连接两个链表

// 让偶链表最后一个结点指向空指针
even_p->next = NULL;
// 把偶链表接在奇链表后,注意偶链表有头结点
odd_p->next = even->next;

题目解答

typedef struct ListNode* list;

struct ListNode* oddEvenList(struct ListNode* head){
    list odd, even;
    odd = (list)malloc(sizeof(struct ListNode));
    even = (list)malloc(sizeof(struct ListNode));
    odd->next = NULL;
    even->next = NULL;
    list odd_p = odd;
    list even_p = even;

    int num = 1;
    while(head != NULL){
        if (num % 2 == 1){
            odd_p->next = head;
            odd_p = odd_p->next;
        }else {
            even_p->next = head;
            even_p = even_p->next;
        }
        head = head->next;
        num++;
    }
    even_p->next = NULL;
    odd_p->next = even->next;

    return odd->next;
}

你可能感兴趣的:(LeetCode 328.奇偶链表)