資料結構之鍊錶常考面試題

2021-09-17 22:59:51 字數 3767 閱讀 8513

1、鍊錶與順序表的對比:

鍊錶:記憶體上不連續,不支援下標訪問,使用時不用考慮記憶體問題

順序表:記憶體上連續,支援下標訪問,擴容麻煩

2、鏈表面試題

刪除鍊錶中等於給定值 val 的所有節點。

struct listnode* removeelements(struct listnode* head, int val) 

// 先不考慮第乙個結點,相當於尾刪

struct listnode* cur = head;

while (cur->next != null)

else

} // 如果第乙個結點值為val,相當於頭刪

if (head->val == val)

else

return head;

}

// 2. 反轉乙個單鏈表。

// 先後指標,或者三指標法

struct listnode* reverselist(struct listnode* head) 

return prev;

}

// 3. 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點

// 快慢指標,快每次走兩步

struct listnode* middlenode(struct listnode* head) 

return slow;

}

// 4. 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

class solution 

if (inext;

back = back->next;

} return back;

}};

// 5. 將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

class solution 

if (l2 == null)

listnode* newhead = null; // 新鍊錶的首結點

listnode* newtail = null; // 新鍊錶的尾結點

// 鍊錶l1和l2都不為空,分別取兩個鍊錶的結點拼接在一起組成新的鍊錶

while (l1 != null&&l2 != null)

else

l1 = l1->next;

} // 取第二個鍊錶的結點

else

else

l2 = l2->next;

} // 如果乙個鍊錶被取完了

if (l1 != null)

else

} return newhead;

}};

// 6. 編寫**,以給定值x為基準將鍊錶分割成兩部分,所有小於x的結點排在大於或等於x的結點之前 .

class partition 

} else

else

} }// 拼接鍊錶

if (small_last != null)

if (big_last != null)

if (small != null)

else

}};

// 7. 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。

class solution 

listnode* fask = (listnode*)malloc(sizeof(listnode));

fask->next = phead;

listnode* prev = fask;

listnode* p1 = phead;

listnode* p2 = phead->next;

while (p2 != null)

else

// 開始刪除重複結點

prev->next = p2;

p1 = p2;

if (p2 != null)

}} phead = fask->next;

free(fask); // 刪除假結點

return phead;

}};

// 8. 鍊錶的回文結構。

class palindromelist 

else if (a->next == null)

// 1、找到鍊錶的中間結點

listnode* fast = a;

listnode* slow = a;

while (fast != null&&fast->next != null)

// 2、逆置後半部分

listnode* p1 = slow;

listnode* p2 = p1->next;

while (p1 != null)

// 3、從頭、尾指標向中間遍歷,判斷a是否是回文

while (a != slow)

else

a = a->next;

slow = slow->next;

} }return true;

}};

// 9. 輸入兩個鍊錶,找出它們的第乙個公共結點。

struct listnode *getintersectionnode(struct listnode *heada, struct listnode *headb) 

struct listnode* p = heada;

struct listnode* q = headb;

// 定義兩個指標同時出發,如果p為null另p=headb,否則讓p=p->next;

// 如果q==null,q=heada,否則q=q->next;

// 最後p=q時返回p,即為交點

while (p != q)

return p;

}

// 10. 給定乙個鍊錶,判斷鍊錶中是否有環。

// 快慢指標,快的先走一步,如果兩個指標相遇則有環,反之無環

bool hascycle(struct listnode *head) 

struct listnode* fast = head->next;

struct listnode* slow = head;

while (fast != null)

slow = slow->next;

fast = fast->next;

if (fast)

fast = fast->next;

}return false;

}

// 11. 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null

// 快慢指標,快指標比慢指標快一步,如果快指標小於慢指標,則必有環,此時返回快指標即為入環的第乙個結點

struct listnode *detectcycle(struct listnode *head) 

if (head->next == head)

struct listnode* fast = head->next;

struct listnode* slow = head;

while (fast != null&& fast>slow)

return fast;

}

資料結構與演算法常考面試題

陣列和字串是最基本的資料結構,在很多程式語言中都有著十分相似的性質,而圍繞著它們的演算法面試題也是最多的。很多時候,在分析字串相關面試題的過程中,我們往往要針對字串當中的每乙個字元進行分析和處理,甚至有時候我們得先把給定的字串轉換成字元陣列之後再進行分析和處理。舉例 翻轉字串 algorithm 解...

C 常考面試題

1.string類的實現 string string const char str else string string const string str string string operator const string str delete m data m data new char st...

Redis常考面試題

select命令切換資料庫 select 1 dbsize檢視當前資料庫的key的數量 dbsize flushdb清空當前庫,flushall清空全部庫 1.對鍵的操作 檢視所有的key keys 判斷某個key是否存在 exists key的名字 檢視key的型別 type key 從某個庫中刪...