328. Odd Even Linked List

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.

You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.

Example:
Given 1->2->3->4->5->NULL,
return 1->3->5->2->4->NULL.

Note:
The relative order inside both the even and odd groups should remain as it was in the input. 

The first node is considered odd, the second node even and so on ...

題意就是把奇數偶數分成兩部分,相對順序不變,特別小心鏈表成環的情況。理解錯題意了,只是把錯位的分開即可。。。

 ListNode* oddEvenList(ListNode* head) {
      if (head == NULL || head->next == NULL){
		return head;
	}
	ListNode* h1 = head;
	ListNode* hji = NULL;
	ListNode* hou = NULL;
	ListNode* jihead = NULL;
	ListNode* ouhead = NULL;
	int num1 = 0;
	int num2 = 0;
	int type =0;//第一個爲奇數則爲1 第一個爲偶數 則爲-1
	if (h1->val % 2 == 0){
		hou = h1;
		ouhead = hou;
		num2++;
		type = -1;
	}
	else{
		hji = h1;
		jihead = hji;
		num1++;
		type = 1;
		cout << "1" << endl;
	}
	h1 = h1->next;
	while (h1 != NULL){
		ListNode *t = h1->next;
		if (h1->val % 2 == 1){
			num1++;
			if (hji == NULL){
				hji = h1;
				jihead = hji;
				hji->next =NULL;//特別小心  否則構成環
				cout << "2" << endl;
			}
			else{
				hji->next = h1;
				hji = hji->next;
				hji->next =NULL;
				cout << "3" << endl;
			}
		}
		else{
			num2++;
			if (hou == NULL){
				hou = h1;
				ouhead = hou;
				hou->next = NULL;//特別小心  否則成環
				cout << "4" << endl;
			}
			else{
				hou->next = h1;
				hou = hou->next;
				cout << "5" << endl;
				hou->next = NULL;
			}
		}
		h1 = t;
	}
	if (num1 == 0){
		return ouhead;
	}
	if (num2 == 0){
		return jihead;
	}
	if(type==1){
	   	hji->next = ouhead;
	return jihead; 
	}else{
	    hou->next = jihead;
	 return ouhead;
	}
    }

正確的代碼:

    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null)  
            return head;  
        ListNode even_head = head.next;  
        ListNode odd = head, even = even_head;  
        while(even != null && even.next != null)   
        {  
            odd.next = even.next;  
            even.next = even.next.next;  
            odd = odd.next;  
            even = even.next;  
        }  
        odd.next = even_head;  
        return head;  
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章