[Interview] Bubble sort using singly-linked list

  • Question : 
    • Bubble sort using singly-linked list
    • 群暉面試題
  • Idea : 
    • 在linked list 交換node與node時, 我們會想用換*next的方式。但是這裡是singly-linked list.
      還會需要previously node。其實這裡單純直接換int val還比較簡單。不過算蠻偷吃步的
  • Code : [根本就是array版]
  • typedef struct Node{
        int val;
        struct Node *next;
    }Node, *NodePtr;
    void bubbleSort(NodePtr head) {
        int i,j,tmp;
        bool flag;
        for(i = 0; i < len-1 ;i++) {
            NodePtr curr = head;
            NodePtr next = head->next;
            flag = false;
            for(j=0; j < len-i-1 ;j++) {
                if(curr->val > next->val ) {
                    tmp = curr->val;
                    curr->val = next->val; 
                    next->val = tmp;
                    flag = true;
                }
            }
            if(flag == false) break; // 沒有結點需要swap
        }
    }
    
  •   [修改*next 版]
void bubbleSort(NodePtr head) {
	bool flag = true;
	while(flag) {
		flag = false;
		NodePtr curr = head;
		NodePtr prev = NULL;
		while(curr->next){
			if(curr->val > curr->next->val) {
				flag = true;
				curr = swap(curr,curr->next);
				if(prev == NULL) //while swaping the head node
					head = curr;
				else
					prev->next = curr;
			}
			prev = curr;
			curr = curr->next;
		}
	}
}

    [使用dummyHead版] - 可以減少一個if, 來判斷swap頭結點的情況。

void bubbleSort(NodePtr head) {
	bool flag = true;
	NodePtr dummyHead = (NodePtr)malloc(sizeof(Node));
	dummyHead->next = head;
	while(flag) {
		flag = false;
		NodePtr curr = dummyHead->next;
		NodePtr prev = dummyHead;
		while(curr->next){
			if(curr->val > curr->next->val) {
				flag = true;
				prev->next = curr = swap(curr,curr->next);
			}
			prev = curr;
			curr = curr->next;
		}
		printf("flag:%d ",flag);
		print_all(dummyHead->next);
	}
}

  

  • 完整測資 : https://github.com/bittorrent3389/leetCode/blob/master/BubbleSort.c

posted @ 2015-08-17 15:10  jeremyatchina  阅读(334)  评论(0编辑  收藏  举报