力扣网第328题——奇偶链表(C语言)

力扣网第328题——奇偶链表(C语言)

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

请尝试使用原地算法完成。你的算法的空间复杂度应为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

说明:

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

解题步骤:

第一步:将p1指向head,将odd链表指向p1,即p1指向第一个结点,p2指向第二个结点;初始化even,指向NULL。
力扣网第328题——奇偶链表(C语言)_第1张图片
第二步:将第一个结点(也是第一个奇结点)的next域指向第三个结点(第二个奇结点),然后将第一个偶数结点取出,并插入偶数链表当中,最后移动p1指针,使其指向第二个奇结点。
力扣网第328题——奇偶链表(C语言)_第2张图片
第三步:判断所给链表是否只有三个结点,若只有三个结点,则将偶数链表接在奇数链表后面,然后返回;若大于三个结点,则将第一个偶结点的next域指向第二个偶结点,并将指针p2指向第二个偶结点。
力扣网第328题——奇偶链表(C语言)_第3张图片
第四步:向后循环式查询,奇结点插入奇数链表中,偶结点插入偶数链表中。
力扣网第328题——奇偶链表(C语言)_第4张图片
最后:将偶数链表连接在奇数链表的后面
力扣网第328题——奇偶链表(C语言)_第5张图片
代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* oddEvenList(struct ListNode* head){
    if(!head||!head->next||!head->next->next)
        return head;            //至少保证有三个结点
    typedef struct ListNode list;
    list* p1 = head;
    list* odd = p1;             //定义奇数链表以及移动指针p1,p1指向第一个结点
    list* p2 = head->next;      //定义指针p2指向偶数链表,并使其指向第二个结点
    list* even = malloc(sizeof(list));
    even->next = NULL;          //初始化偶数链表,先将偶数链表指向NULL
    p1->next = p2->next;        //将第一个结点(也是第一个奇结点)的next域指向第三个结点(第二个奇结点)
    p2->next = even->next;      //这两条语句的作用,是将第一个偶数结点取出,并插入偶数链表当中
    even->next = p2;
    p1 = p1->next;              //移动p1指针,使其指向第二个奇结点
    //此判断语句旨在于判断是否只有三个结点
    if(p1->next)
    {//如果大于三个结点,则将第一个偶结点的next域指向第二个偶结点,并将指针p2指向第二个偶结点
        p2->next = p1->next;
        p2 = p2->next;
    }
    else
    {//如果等于三个结点,则将偶数链表接在奇数链表后面,并结束返回
        p1->next = even->next;
        return odd;
    }
    while(p1->next&&p2->next)
    {//循环式向后查找,并分别将奇结点插入奇数链表中,偶结点插入偶数链表中
        p1->next = p2->next;
        p1 = p1->next;
        p2->next = p1->next;
        p2 = p2->next;
    }
    p1->next = even->next;      //最后将偶数链表接在奇数链表后面
    return odd;
}

到此结束,感想观看!!!

你可能感兴趣的:(C语言)