《程式設計師面試經典》 鍊錶

2021-08-28 19:15:07 字數 2928 閱讀 7067

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

思路:快慢指標,前乙個指標比後乙個指標慢k步。

/*

struct listnode

};*/

class solution else

}while(phead->next!=null)

return ptail;

}};

實現乙個演算法,刪除單向鍊錶中間的某個結點,假定你只能訪問該結點。

給定待刪除的節點,請執行刪除操作,若該節點為尾節點,返回false,否則返回true

思路:不刪這個節點了,把下個節點值copy過來,然後刪除下個節點

/*

struct listnode

};*/

class remove else

}};

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

給定乙個鍊錶的頭指標 listnode*phead,請返回重新排列後的鍊錶的頭指標。注意:分割以後保持原來的資料順序不變。

思路:建立小數鍊錶和大數鍊錶,最後完成後將兩鍊錶連線,注意頭結點也有值,需要進行比較。

/*

struct listnode

};*/

class partition else

phead=phead->next;

}large->next=null;

small->next=largehead->next;

return smallhead->next;

}};

有兩個用鍊錶表示的整數,每個結點包含乙個數字。這些數字是反向存放的,也就是個位排在鍊錶的首部。編寫函式對這兩個整數求和,並用鍊錶形式返回結果。

給定兩個鍊錶listnode*a,listnode*b,請返回a+b的結果(listnode*)。

測試樣例:

,
返回:
思路:對應位相加,注意是否有進製,最後返回鍊錶長的那個做為結果。

/*

struct listnode

};*/

class plus

return newlist->next;

}};

請編寫乙個函式,檢查鍊錶是否為回文。

給定乙個鍊錶listnode*phead,請返回乙個bool,代表鍊錶是否為回文。

測試樣例:

返回:true
返回:false
思路:

1>反轉鍊錶:可以將原始鍊錶反轉,判斷反轉以後的鍊錶與原始鍊錶是否完全一致,如果一致便返回true,如果不一致則返回false。反轉鍊錶需要額外的儲存空間,不是特別優秀的方法。

2>棧實現:我們可以想到從中間節點向兩側開始比較,如果全部相同,則返回true,否則返回false,因為無法獲得乙個節點的前乙個節點,這個時候我們可以想到用棧實現,先將鍊錶前半部分的元素分別壓入堆疊,然後在遍歷後半部分元素的時候同時和棧頂元素進行比較,如果全部相等則返回true,否則返回false。

特別注意:因為我們不知道鍊錶的的長度,可以通過快慢指標(乙個指標每次移動兩個,乙個指標每次移動乙個)來找到中間元素,這樣整體只需要遍歷鍊錶一次,所需要的棧空間縮小為方法1的一半。

3>遞迴:遞迴方法分為尾部遞迴和首部遞迴,還有中間遞迴,一般的尾部遞迴都可以用迴圈來實現,對於我們這道題目,遞迴的時候無法比較第乙個元素和最後乙個元素,即使知道最後乙個元素,也無法獲得最後乙個元素的前乙個元素。所以我們選擇首部遞迴,先遞迴直到中間的元素,然後比較中間的元素,把比較結果返回,同時儲存後半部分下乙個要比較的元素(用引用傳遞可以,用二級指標也可以),遞迴返回後,如果是true,則繼續比較,如果是false,則直接返回false。

方法一:

/*struct listnode

};*/

class palindrome

pa=phead;

pb=reverselist->next;

while(pa!=null&&pb!=null)else

}return true;

}};

方法二:

/*struct listnode

};*/

class palindrome

if(q->next==null)

while(p->next!=null)

else

}return true;

}};

方法三:

/*struct listnode

};*/

class palindrome

return ispd(phead,&tail,length);

}bool ispd(listnode* phead,listnode** tail,int length)

if(length==1)

if(length==2)else

}bool flag=ispd(phead->next,tail,length-2);

if(flag==false)return false;

listnode* tail1=*tail;

if(phead->val==tail1->val)else

}};

程式設計師面試經典 20200221

題目 實現一種演算法,找出單向鍊錶中倒數第 k 個節點。返回該節點的值。注意 本題相對原題稍作改動 示例 輸入 1 2 3 4 5 和 k 2 輸出 4思路 雙指標,fast指標與slow指標儲存k個間隔。code public intkthtolast listnode head,int k wh...

程式設計師面試經典 陣列

有一副由nxn矩陣表示的影象,這裡每個畫素用乙個int表示,請編寫乙個演算法,在不占用額外記憶體空間的情況下 即不使用快取矩陣 將影象順時針旋轉90度。給定乙個nxn的矩陣,和矩陣的階數n,請返回旋轉後的nxn矩陣,保證n小於等於500,影象元素小於等於256。測試樣例 1,2,3 4,5,6 7,...

程式設計師面試金典 鍊錶

這裡我們可以使用乙個表來記錄訪問過的節點值,這樣只要一次遍歷就可以。但是需要輔助空間。如果不使用臨時緩衝區,該怎麼解決?使用兩個指標,乙個指標指向當前節點,另乙個指標用於向後遍歷剩餘節點,把重複節點刪除。這裡刪除只是用乙個節點就可以,檢查ptr next data是否重複就可以。這裡給出兩種方法 第...