Skip to content

Instantly share code, notes, and snippets.

@KevinKu
Last active March 14, 2016 09:34
Show Gist options
  • Save KevinKu/19be10eb611aac74fc4b to your computer and use it in GitHub Desktop.
Save KevinKu/19be10eb611aac74fc4b to your computer and use it in GitHub Desktop.
#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