鍊錶的相關筆試面試題

2021-09-25 07:51:52 字數 3290 閱讀 4807

1.反轉乙個鍊錶,不能申請新空間:

思路:反轉乙個鍊錶,不申請新空間,即將乙個鍊錶通過頭插+頭刪的方法進行替換;

反轉前:1->2->3->4->5->null;

反轉後:null->5->4->3->2->1;

struct listnode* reverselist(struct listnode* head)

return result;

}

2.刪除表中指定的所有節點:

思路:判斷鍊錶的的節點的值是否為指定節點的值有三種情況:

(1)當頭節點為空時的情況;

(2)當頭節點為指定節點的值時的情況;

(3)當頭節點不是指定節點時的情況;

struct listnode* removeelement

struct listnode* node=head;

while(node->next!=null)

else

if(head->val==val)

else

3.合併兩個有序鍊錶:

將兩個鍊錶合併成乙個有序鍊錶,並返回;新煉表是通過拼接兩個鍊錶所給定的鍊錶的值;

如:1->2->4,1->3->4;

拼接後:1->1->2->2->3->4->4;

struct listnode* mergotwolist(struct listnode* l1,struct listnode* l2)

if(l2==null)

//建立乙個新鍊錶,將兩個拼接的鍊錶放到新煉表中;

struct listnode* l1=c1;

struct listnode* l2=c2;

struct listnode* begin=null;

struct listnode* end=null;

while(c1!=null&&c2!=null)

else

c1 = c1->next;

}else

else

c2 = c2->next;}}

if (c1!= null)

if (c2 != null)

return result;

}

4.分割鍊錶問題:

編寫**,給定乙個值x為基準,將鍊錶分割為兩部分,所有小於x的結點排在大於或等於x的鍊錶之前;分割以後要保持原來的資料順序不變;

注意:需要注意比x小的或比x大的鍊錶有為空的情況;一定要保證結果鍊錶的最後乙個節點為null;

struct listnode *partition(struct listnode *phead, int x)

else

}else

else

}node = node->next;

}if (smalllast != null)

if (biglast != null)

if (smalllast != null)

else

}

5.返回鍊錶的中間節點:

給定乙個帶有頭結點head的非空單鏈表,返回鍊錶的中間結點,如果兩個中間結點,則返回第二個中間結點;在這裡考察的主要是指標的運用,通過快慢指標進行遍歷,當乙個指標指向null時,另乙個指標剛好指向該鍊錶的中間節點;

struct listnode *middlenode(struct listnode * head)

slow = slow->next;

fast = fast->next;

}return slow;

}

6.刪除鍊錶中的重複節點問題:

在乙個排序的鍊錶中存在著重複得結點,請刪除該鍊錶中的重複結點,重複的結點不保留,返回煉表頭指標;如:鍊錶1->2->3->3->4->4->5,處理後為1->2->3->4->5;

這裡可以通過雙指標遍歷去查詢,當前面的指標指向的節點的值與後乙個指標指向節點的值相同時,後面的指標指向的位置不變,前面的指標繼續向前走,當兩個指標指向的值不同時,後面的指標走到前面的指標的位置,前面的指標繼續向前尋找,知道遇到null;

struct listnode *deleteduplication(struct listnode * phead)

struct listnode *fack = (listnode *)malloc(sizeof(listnode));

fack->next = phead;

struct listnode * prev = fack;

struct listnode * p1 = phead;

struct listnode * p2 = phead->next;

while (p2 != null)

else

prev->next = p2;

p1 = p2;

if (p2 != null)}}

phead = fack->next;

free(phead);

return fack->next;

}

7.找到兩鍊錶交叉的起始節點:
//先求出鍊錶的長度;

int getlength(struct listnode * head)

return len;

}struct listnode *getintersectionnode(struct listnode *pheada, struct listnode *pheadb)

for (int i = 0; i < diff; ++i)

while (longer != shorter)

return longer;

}

8.判斷鍊錶是否帶環,找到環的入口點:
struct listnode *detcctcycle(struct  listnode *head)

struct listnode* fast = head;

struct listnode *slow = head;

while (1)

fast = fast->next;

if (fast == null)

slow = slow->next;

if (fast == slow)

}struct listnode * n1 = head;

struct listnode *n2 = slow;

while (n1 != n2)

return n1;

}

關於鍊錶的筆試 面試題

以下題目 於leetcode 有兩個鍊錶,它們表示逆序的兩個非負數。計算出兩個數的和之後,同樣逆序輸出作為乙個鍊錶 比如 2 1 3 5 6 4 得到 7 0 8 add two numbers class solution if carry 0 prev next new listnode car...

IT筆試面試題整理 反轉鍊錶

試題描述 定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點 參考 方法一 1 public static link reverselinklist link head 217 cur.next pre 當current為最後乙個節點時,back為null,所以要再指向前節點 1...

鍊錶筆試面試題

有些許錯誤,第乙個程式 1.已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序 cpp view plain copy void list reverse head next null head p 遞迴方法 cpp view plain copy void list reverse2 list n...