程式設計練習 鍊錶必考重點演算法

2021-09-25 06:20:47 字數 1888 閱讀 7700

一、單鏈表反轉

linklist reserve_l(linklist l)

}

上面這一種是 不算表頭的 表頭里沒有資料

下面這一種是表頭帶資料,表頭也要丟到最後

listnode* reverselist(listnode* phead) 

return preversehead;

}

二、判斷單鏈表是否有環

bool isloop(node *head)

return false;

}

三、判斷鍊錶中的環的入口

listnode* enterofloop(listnode* phead)

listnode *pfast=phead->next->next;

lisenode *pslow=phead->next;

while(pfast!=pslow)

else return null;

} pfast=phead;

while(pfast!=pslow)

return pfast;

}

四、合併2個有序鍊錶

遞迴操作:

node mergelist(node list1,node list2)

else

resultnode->next=mergelist(list1,list2);

return resultnode;

}

非遞迴寫法

listnode* merge(listnode* phead1, listnode* phead2)

pre1 = p1;

p1 = p1->next;

}if(p2)

pre1->next = p2;

return phead1;

}

五、刪除鍊錶中重複出現的結點

(1)重複的全部刪除

pre指標指向一定不重複的結點,last是工作指標用於遍歷。

listnode* deleteduplication(listnode* phead)

pre->next = last->next;//標誌處

last = last->next;

}else

}return head->next;

}

(2)重複的結點保留一次

public static node deletedup3(node x) 

if (tmp->val == tmp->next->val) else

}return x;

}

遞迴解法

public static node deletedup4(node head)
六、找出兩個鍊錶的第乙個公共結點

listnode* findfirstcommonnode( listnode* phead1, listnode* phead2) 

p = phead2;

while(p != null)

p = p->next;

}return null;

}

最後一提,乙個綜合的演算法題目

乙個鍊錶假設第乙個節點定位下標1,第二個為2,下標為奇數的結點是公升序排序,偶數的結點是降序排序,如何讓整個鍊錶有序?

第一步 拆分成2個鍊錶儲存

第二步 其中乙個鍊錶進行反轉

第三步 合併2個有序鍊錶。

這裡不細說了 上面都有提到過,讀者們自行編碼除錯吧!

鍊錶程式設計練習

深刻感覺,基礎很重要,閒暇時間,做簡單鍊錶程式設計練習。ifndef list h define list h include include typedef struct linknodelist linknode linknode linklistcreate const intn linkno...

演算法練習 鍊錶求和

題目 給定兩個用鍊錶表示的整數,每個節點包含乙個數字。這些數字是反向存放的,也就是個位排在鍊錶首部。編寫函式對這兩個整數求和,並用鍊錶形式返回結果。示例 輸入 7 1 6 5 9 2 即617 295輸出 2 1 9,即912個人思路 因為兩個鍊錶低位在前,所以直接遍歷兩個鍊錶的值進行相加即可,加法...

演算法練習之環形鍊錶

1.環形鍊錶 給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數pos來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果pos是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2...