鍊錶練習題

2021-08-28 04:21:53 字數 2908 閱讀 4455

鍊錶    這裡我記錄了鍊錶的各種操作的演算法,在後面的習題中會涉及到這些演算法的思路。

leetcode206.反轉鍊錶

反轉乙個單鏈表。

示例:

輸入: 1->2->3->4->5->null

輸出: 5->4->3->2->1->null

反序的演算法之前記錄過,可以就地反序,也可以使用棧反序,這裡為了節省時間和空間,就用就地反序的方法。

ac**如下:

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* reverselist(struct listnode* head)

return p;

}

leetcode237.刪除鍊錶中的節點

請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點,你將只被給定要求被刪除的節點。

現有乙個鍊錶 -- head = [4,5,1,9],它可以表示為:

4 -> 5 -> 1 -> 9
示例 1:

輸入: head = [4,5,1,9], node = 5

輸出: [4,1,9]

解釋: 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 -> 1 -> 9.

示例 2:

輸入: head = [4,5,1,9], node = 1

輸出: [4,5,9]

解釋: 給定你鍊錶中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 -> 5 -> 9.

說明:

一般刪除鍊錶結點,是將要刪除的結點的前乙個結點指向要刪除的結點的後乙個結店。本題中只給了要刪除的結點,沒有給頭結點,而且是單鏈表,無法向前回溯,我們就不能用傳統的方法了。仔細回想刪除陣列中乙個數的過程,就是將這個數之後的所有數都向前移動一位,再將最後那個數刪除掉。這種方法也可以應用在這裡,不過由於鍊錶的特性,我們不用把後面每個數的向前移,只需移動後乙個結點,然後刪除後乙個結點即可。ac**如下:

/**

* definition for singly-linked list.

* struct listnode ;

*/void deletenode(struct listnode* node)

leetcode328.奇偶鍊錶

給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。

請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o(1),時間複雜度應為 o(nodes),nodes 為節點總數。

示例 1:

輸入: 1->2->3->4->5->null

輸出: 1->3->5->2->4->null

示例 2:

輸入: 2->1->3->5->6->4->7->null 

輸出: 2->3->6->7->1->5->4->null

說明:

將奇數結點和偶數結點排在一起,即每個結點都指向自己後面的第兩個節點,最後尾結點連線第二個節點。需要注意的是,本題中給的鍊錶的結點數可能是奇數,鍊錶的尾部會有乙個落單的結點無法交換位置。如果鍊錶有0個、1個、2個結點的話,直接返回即可。ac**如下:

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* oddevenlist(struct listnode* head)

p1->next=q;

return head;

}

leetcode24.兩兩交換鍊錶中的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。

示例:

給定1->2->3->4, 你應該返回2->1->4->3.
說明:

本題不是交換相鄰結點的值,則要進行指標的移動。交換相鄰結點需要移動三個指標,例如->3->4->5,要移動3和4,則要將三個指標全斷開,重新連線。我們可以定義兩個指標p1和p2來進行移動操作,p1指向要移動的一隊結點的第乙個結點,p2指向p1的前乙個結點。前兩個節點比較特殊,只需要移動兩個指標,做特殊處理。ac**如下:

/**

* definition for singly-linked list.

* struct listnode ;

*/ if(head==null || head->next==null)

return head;

struct listnode *p=head->next->next;

head->next->next=head;

head=head->next;

head->next->next=p;

if(p==null || p->next==null)

return head;

struct listnode *p1=head->next,*p2=p1->next;

while(p2->next)

return head;

}

鍊錶練習題1

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

有關鍊錶的練習題。

剛剛學了線性表,會了一些基本操作,現在來做一些經典面試題來鞏固一下知識。一。列印鍊錶從尾到頭。1 從尾到頭列印單鏈表。普通法 void print slistnode pfirst end pnode 將pnode賦給end。pnode pfirst 將pnode賦成頭結點列印出此時的值,繼續迴圈。...

鍊錶課後練習題(基礎)

13人圍成一圈,報到3退出,找到留在圈子中的人原來的序號 include include include using namespace std define len sizeof struct student struct student struct student creat int n re...