一、鏈表的反轉
1.不申請輔助鏈表實現鏈表的反轉
//反轉鏈表
void re_list(list* head) {
//當節點個數小於2個時不需要反轉
if (num_node(head) <= 1) { return; }//申請兩個指針,分別執行第一和第二個節點,並依次相加,改變鏈表的方向
list *one=head->next;
list *second= one->next;
//先完成第一個和第二個節點的反轉,並使得第一個節點指向NULL,作爲最後一個節點
list* temp = second->next;
second->next = one;
one->next = NULL;
one = second;
second = temp;
//兩指針依次相加,並反轉鏈表單向
while (second != NULL) {
list* temp= second->next;
second->next = one;
one = second;
second = temp;
}
//此時指針one指向原先鏈表的最後一個節點,反轉後和頭相連
head->next = one;}
2.訪問倒數第i個節點,並只遍歷一遍
//查找倒數第i個節點 使用快慢兩個指針實現
list* find_lasti_node(list* head,int i) {
if (i > num_node(head)) { printf("find i error\n"); return NULL; }
if (i < 1) { printf("find i error\n"); return NULL; }
list* fast=head;
list* slow=head;
//fast指針超前slow指針i個位置 當fast指針到達鏈表尾部時 slow指針指向倒數第i個位置
int num = 0;
while (fast->next != NULL)
{
num++;
if (num >= i)slow = slow->next;
fast = fast->next;
}
return slow;
}
3.訪問鏈表的中間節點
//查找鏈表中間的節點
list* find_mid_node(list* head) {
if (num_node(head)<1) { printf("find i error\n"); return NULL; }
list* fast = head;
list* slow = head;
//fast指針快於slow指針兩倍的遍歷速度 當fast指針到達鏈表尾部時 slow指針指向中間位置
while (fast!=NULL&&fast->next!=NULL)//使用兩個判斷條件防止節點數的奇偶,且fast指針判斷在前
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}