美文网首页
LeetCodeDay42 —— 奇偶链表★★

LeetCodeDay42 —— 奇偶链表★★

作者: GoMomi | 来源:发表于2018-05-22 11:32 被阅读0次

    328. 奇偶链表(Odd Even Linked List)

    简述

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

    示例
      输入:
        1->2->3->4->5->NULL
      输出:
        1->3->5->2->4->NULL
      说明:
        应当保持奇数节点和偶数节点的相对顺序。
        链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
    
    思路
    1. 每次操作一组奇偶节点,odd->next = even->next, odd = odd->next, even->next = odd->next, even = even->next
    2. 每次操作一个节点,根据一个bool变量来判断当前节点的奇偶性。
    3. 本题设计较多的指针操作,难点在于将思路落实为代码,实现的过程中,要避免死循环。
    class Solution_328_01 {
     public:
      ListNode* oddEvenList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode* evenHead = head->next;
        ListNode *odd = head, *even = head->next;
        while (even && even->next) {
          odd->next = even->next;
          odd = odd->next;
          even->next = odd->next;
          even = even->next;
        }
        odd->next = evenHead;
        return head;
      }
    };
    
    class Solution_328_02 {
     public:
      ListNode* oddEvenList(ListNode* head) {
        if (!head || !head->next || !head->next->next) return head;
        ListNode *oHead = head, *eHead = head->next;
        ListNode *oNode = oHead, *eNode = eHead;
        ListNode* pTmp = head->next->next;
        bool isOdd = true;
        while (pTmp) {
          if (isOdd) {
            oNode->next = pTmp;
            oNode = oNode->next;
          } else {
            eNode->next = pTmp;
            eNode = eNode->next;
          }
          isOdd = !isOdd;
          pTmp = pTmp->next;
        }
        oNode->next = eHead;
        // 奇数个元素时,eNode指向的是最后一个oNode,这里需置空
        eNode->next = NULL;
        return oHead;
      }
    };
    

    相关文章

      网友评论

          本文标题:LeetCodeDay42 —— 奇偶链表★★

          本文链接:https://www.haomeiwen.com/subject/nydhjftx.html