【12.8 4】編寫乙個函式,反序排列乙個單鏈表中所有的節點。函式應該具有下面的原型:
struct node *sll_reverse(struct node *first);
在標頭檔案singly_linked_list_node.h中宣告節點資料結構。函式的引數指向鍊錶的第乙個節點。當鍊表被重排之後,函式返回乙個指向鍊錶新頭節點的指標,鍊錶最後乙個節點的link欄位的值應設定為null,在空鍊錶(first == null)上執行這個函式將返回null。
實現單鏈表的反轉方法有很多種,這裡就一一討論一下各個版本的實現:
思想:每次把原鍊錶還沒有移動的第乙個節點移動到最前面。
操作起來需要幾個2個輔助指標。
node * sll_reverse(node *head)
//2個輔助指標用於移除某個節點,插入到頭部
node *current;
node *next;
current = head;
next = head->link;
while(next != null)
return head;
}node *init_link()
return head;
}void display(node *list) while((p = p->link) != null);
printf("\n");
}int main()
時間複雜度:空間複雜度:思想:迭代過程中使用3個指標prev, current, next輔助,逐個改變原鍊錶的指標指向。
node * sll_reverse(node *head)
//3個輔助指標用於迭代逐個改變指標指向
node *prev = null;
node *current = head;
node *next = head->link;
while(1)
prev = current;
current = next;
next = next->link;
}head = current;
return head;
}
最後一次的跳出迴圈需要注意,這裡倒數第二次迴圈current指向了最後乙個指標,但是它的link還未指向prev。所以在最後一次迴圈的時候還需要將current的link指標指向prev。
時間複雜度:空間複雜度:思想:這個思路很簡單,構建乙個新的鍊錶,每次取乙個原鍊錶的節點插入到新鍊錶的頭部。
node * sll_reverse(node *head)
node *new_head = null;
node *temp;
while(head != null)
return new_head;
}
時間複雜度:空間複雜度:思想:利用遞迴,從鍊錶的尾部向前遍歷,依次改變每個節點的指向,指向前乙個節點。a
node * sll_reverse(node *head)
node *new_head = sll_reverse(head->link);
head->link->link = head;
head->link = null;
return new_head;
}
時間複雜度:空間複雜度:小結: 反轉單鏈表是面試中非常常見的考題,這是對指標理解考察的基本題目,這裡列了4種基本的演算法思路,有最簡單的構建新鍊錶然後依次插入頭部的方法,也有利用輔助指標逐個修改指標link的指向的演算法,也有每次把乙個節點排到最前面的演算法,還有利用遞迴從尾部向前逐個修改指標的演算法。
PHP面試考點 4 流程控制
4.流程控制 請列出3中php迴圈陣列的方法,說出各自的區別 for foreach while.list each 組合 for只能遍歷索引陣列,其他兩個能遍歷索引陣列和關聯陣列 foreach能重置陣列的指標 while.list.each 不能重置指標 php分支考點 if.elseif只能有...
前端面試筆試高頻考點
let,const,var的區別。const定義的物件是否可以修改 var 宣告變數 可以進行變數提公升 let 宣告變數 不能進行變數提公升 作用域比var更小 形成塊級作用域 const 宣告變數 宣告常量 定義的變數不能修改,但物件可以修改 js的基本資料型別 五中可包含值的型別 字串 str...
面試高頻考點之vector容器篇
vector是c 中stl standard template libaray 標準模板庫 的乙個容器元件,vector是表示可變大小陣列的序列容器,就像陣列一樣,vector也採用的連續儲存空間來儲存元素。也就是意味著可以採用下標對vector的元素進行訪問,和陣列一樣高效。但是又不像陣列,它的大...