單鏈表逆置 排序 合併 約瑟夫環問題

2021-09-29 21:48:32 字數 1571 閱讀 9339

單鏈表的基本實現:

單鏈表的排序(冒泡)

單鏈表的倒數第k個值(只能遍歷一遍單鏈表)

逆置單鏈表

兩個單鏈表的合併問題

單鏈表的約瑟夫環問題

1.單鏈表的排序(冒泡)

對單鏈表的資料從小到大進行排序,根據冒泡 排序的原理完成

//對鍊錶資料進行排序

void sort(list list)

} }}

2.單鏈表的倒數第k個值(只能遍歷一遍單鏈表)定義兩個指標兩個指標分別往後走,第乙個指標先走k步為快指標,第二個指標然後和第乙個指標一起往後走,當第快指標走到最後麵時,此時的慢指標剛好就是倒數第k個值。

//單鏈表倒數第k個的值

void findknode(list list, int k)

} printf("%d\n", slow->data);

}

3.逆置單鏈表

//單鏈表的逆置1

void reveselist1(list list)

}

4.兩個單鏈表的合併問題兩個有序鍊錶,合併後依然有序 

node *link_merge(list head1, list head2)

else

tail = newq->next; //指向已排好序的1節點

while (p && q)

else

tail = tail->next;

} if (p)

else

return newq;

}

5.單鏈表的約瑟夫環問題約瑟夫環(約瑟夫問題)是乙個數學的應用問題:

已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從頭開始報數,數到k的那個人出列;他的下乙個人又從1開始報數,數到k的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後剩餘的節點即為原問題的解。

//約瑟夫環

void josepring(list list, int k)

cur->next = list->next; //鍊錶形成環

cur = list->next;

while (cur->next != cur) //相等時只剩下乙個節點

//走到這裡就開始刪除,然後繼續迴圈

printf("刪除的數為%d \n", cur->data);

prev->next = cur->next;

free(cur);

cur = prev->next;

} printf("最後乙個人是 %d \n", cur->data);

}

單鏈表 約瑟夫環問題

分析 比如由5個節點組成乙個環,從第1個節點開始報數,每報數2個節點刪除乙個節點,單鏈表如下 1 設定乙個helper輔助節點,指向最後乙個節點 2 因為是從第k個節點開始報數,因此先讓first和helper走k 1步,這樣first節點就指向報數的第乙個節點了,k初始值為1,因此不用向前走 3 ...

單鏈表逆置

單鏈表逆置 include include define item num 10 typedef struct tagnode node node linklist create void linklist destroy node head void linklist print node hea...

單鏈表逆置

name 單鏈表逆置 author 巧若拙 date 22 11 14 16 13 description 分別用遞迴和非遞迴兩種方式實現單鏈表 不含頭結點 的逆置 include include include typedef char elemtype typedef int status 函式...