C語言連結串列的5種常見操作
阿新 • • 發佈:2018-12-19
C語言連結串列的5種常見操作
typedef struct list{
int item;
struct list* next;
}myList
單鏈表反轉
myList* invList(myList* head){
if(head == null) return null;
myList* prev = null, * next = null;
while (head){
next = head->next;
head->next = prev;
prev = head;
heady = next;
}
return head;
}
連結串列中環的檢測
int hasCycle(myList* head){
myList* fast = head;
myList* low = head;
while(fast != NULL && fast->next != NULL){
low = low->next;
fast = fast->next->next;
if (low == fast){
return 1;
}
}
return 0;
}
兩個有序的連結串列合併
myList* mergeList(myList* li1, myList* li2){
myList head = {0};
myList* pRes = &head;
while(1){
if(li1 == NULL){
pRes->next = li2;
}
if (li2 == NULL){
pRes->next = li1;
}
if(li1->item < li2-> item){
pRes->next = li1;
li1 = li1->next;
}else{
pRes->next = li2;
li2 = li2->next;
}
pRes = pRes->next;
}
return head;
}
刪除連結串列倒數第n個結點
myList* removeNthFromEnd(myList* head,int n){
myList* fast = head;
myList* prev = NULL;
myList* next = head;
int k = n;
/*快指標往後移動k-1*/
while((k > 1) && (fast != NULL)){
fast = fast->next;
k--;
}
/*說明連結串列數目不足n個*/
if (fast == NULL){
return head;
}
/*快指標移動至最後時,prev到達倒數第n個*/
while (fast->next != NULL){
fast = fast->next;
prev = next;
next = next->next;
}
if(prev == NULL){
//倒數第n個為第一個
head = head->next;
}else{
prev->next = prev->next->next;
}
return head;
}
求連結串列的中間結點
myList* middleNode(myList* head)
{
myList* fast = head;
myList* low = head;
while(fast != NULL && fast->next != NULL)
{
low = low->next;
fast = fast->next->next;
}
return low;
}