Last active
March 14, 2016 09:34
-
-
Save KevinKu/19be10eb611aac74fc4b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
typedef struct List_node{ | |
int value; | |
struct List_node *next; | |
}List_node; | |
typedef struct List_node List; | |
List *swap(List *head ,List *node_1 ,List *node_2){ | |
if( (head == NULL) || (node_1 == NULL) || (node_2 == NULL) || (node_1 == node_2) ) | |
return head; | |
/* | |
這邊先排除掉三個node其中為0 以及 | |
要交換的node相同的情形 有交換和沒交換是一樣的 | |
*/ | |
int num_pre_node_1_and_node_2 = 0 ; | |
/* | |
用來確保兩個node(node_1 node_2)都有在linked list裡面 | |
這個 num_pre_node_1_and_node_2數值為2的時候 代表兩個都在 1代表其中一個 0代表兩個都不在 | |
*/ | |
List *_head = head ; | |
/* | |
_head用來暫時紀錄linked list最開頭的node address | |
*/ | |
List *pre_node_1,*pre_node_2,*tmp_node; | |
/* | |
pre_node_1與pre_node_2用來紀錄在node_1與node_2之前的node | |
tmp_node用來記錄其中一個(node_1 or node_2)的next address | |
*/ | |
while(head && head->next){ | |
if(head->next == node_1){ | |
pre_node_1 = head; | |
num_pre_node_1_and_node_2 = num_pre_node_1_and_node_2 + 1; | |
} | |
if(head->next == node_2){ | |
pre_node_2 = head; | |
num_pre_node_1_and_node_2 = num_pre_node_1_and_node_2 + 1; | |
} | |
/* | |
有看過有人用兩次while找 | |
個人以為只需要一次就可以了 | |
但是這while head的部分沒檢查到 所以下面再補上兩個if | |
*/ | |
head = head->next; | |
} | |
head = _head; | |
if(head == node_1){ | |
pre_node_1 = NULL; | |
num_pre_node_1_and_node_2 = num_pre_node_1_and_node_2+ 1; | |
} | |
if(head == node_2){ | |
pre_node_2 = NULL; | |
num_pre_node_1_and_node_2 = num_pre_node_1_and_node_2+ 1; | |
} | |
/* | |
用來檢查head是否為node_1 或 node_2 | |
*/ | |
if(num_pre_node_1_and_node_2 != 2) | |
return head; | |
if(pre_node_1 == NULL){ | |
pre_node_2->next = node_1; | |
tmp_node = node_1->next; | |
node_1->next = node_2->next; | |
node_2->next = tmp_node; | |
return node_2 ; | |
} | |
if(pre_node_2 == NULL){ | |
pre_node_1->next = node_2; | |
tmp_node = node_2->next; | |
node_2->next = node_1->next; | |
node_1->next = tmp_node; | |
return node_1; | |
} | |
/*以上兩個if 處理node_1 或 node_2為head的情形*/ | |
if(node_2->next == node_1){ | |
pre_node_2->next = node_1; | |
tmp_node = node_1->next; | |
node_1->next = node_2; | |
node_2->next = tmp_node; | |
return head; | |
} | |
if(node_1->next == node_2){ | |
pre_node_1->next = node_2; | |
tmp_node = node_2->next; | |
node_2->next = node_1; | |
node_1->next = tmp_node; | |
return head; | |
} | |
/* | |
以上兩個if處理node_1 與 node_2相鄰 | |
說到這就不得不佩服gdb了 | |
這錯誤是在gdb給測資出現的 | |
當時寫code完全沒考慮到相鄰的情形 | |
*/ | |
pre_node_1->next = node_2; | |
tmp_node = node_2->next; | |
node_2->next = node_1->next; | |
pre_node_2->next = node_1; | |
node_1->next = tmp_node; | |
return head; | |
/* | |
這段就是兩個不是head 中間有node的情況 也是開始做題目一開始想到的例子 | |
*/ | |
} | |
int main(){return 0;} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment