輸入乙個鍊錶,輸出該鍊錶中倒數第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是否重複就可以。這裡給出兩種方法 第...