鏈表的反轉、單次訪問任意(倒數)節點

一、鏈表的反轉

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章