• 【leetcode】328 Odd Even Linked List


    题目说明

    https://leetcode-cn.com/problems/odd-even-linked-list/description/
    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
    请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

    解法1

    /*
     * 时间复杂度:O(n)
     * 用index来判断是是否为奇偶,记录最后一个奇数结点oddptr
     * 遍历链表将奇数结点插入到oddptr之后
     */
    ListNode* oddEvenList(ListNode* head) {
        ListNode *pre = head;
        ListNode *oddptr = head;
        ListNode *cur = NULL;
        ListNode *cur_next = NULL;
        int index = 1;
    
        while(pre && pre->next){
            index ++;
            cur = pre->next;
    
            if (index % 2){
                cur_next = cur->next;
                cur->next = oddptr->next;
                oddptr->next = cur;
                pre->next = cur_next;
                oddptr = oddptr->next;
            } else{
                pre = pre->next;
            }
        }
        return head;
    }
    

    解法2

    /*
     * 时间复杂度:O(n)
     * 用两个指针分别指向第一个结点first与第二个结点second,即第一个奇数结点与第一个偶数结点
     * first指向second的下一个结点,即第二个奇数结点,这样就将两个奇数结点串起来了,再将first向后移动一位
     * 同理second也指向第二个偶数结点,再将second后移
     * 如此循环,直到链表结束,就得到了奇数链表与偶数链表
     * 最后将最后一个奇数结点指向第一个偶数结点,将奇偶串起来,即完成链表重组。
     */
    ListNode* oddEvenList(ListNode* head) {
        if (head == NULL)
            return NULL;
        ListNode *first = head;
        ListNode *second = head->next;
        ListNode *temp = second;
    
        while(second && second->next){
            first->next = second->next;
            first = first->next;
            second->next = first->next;
            second = second->next;
        }
        first->next = temp;
        return head;
    }
  • 相关阅读:
    密码保护
    实现搜索功能
    完成个人中心—导航标签
    个人中心标签页导航
    评论列表显示及排序,个人中心显示
    完成评论功能
    从首页问答标题到问答详情页
    首页列表显示全部问答,完成问答详情页布局
    Android基础学习:Android环境搭建
    liunx 硬盘分区
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/9570036.html
Copyright © 2020-2023  润新知