牛客oj:鍊錶中倒數第k個結點牛客oj九度oj:
github**: 015-鍊錶中倒數第k個結點
csdn題解:劍指offer–015-鍊錶中倒數第k個結點
九度oj
csdn題解
github**
鍊錶中倒數第k個結點
1517-鍊錶中倒數第k個結點
劍指offer–015-鍊錶中倒數第k個結點
015-鍊錶中倒數第k個結點
您也可以選擇回到目錄-劍指offer–題集目錄索引
題目描述
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。這道題我想大多數人都會有思路,因為我們已經見的很多了
最暴力的方式,兩趟遍歷,第一趟先求出list的長度length,然後進而length - k得到倒數第k個節點的位置
當然我們大多數都會知道另外乙個更加高效的方法,雙指標法
其實就是第乙個指標right先向前走k步,然後left和right一起走,此時兩個指標差別k步,那麼當right走到鍊錶尾部的時候,left指向的就是倒數第k個節點
期間要注意的問題有
/// 1 -> 2 -> 3 -> 4 -> 5
/// 比如要走倒數第3個節點
/// 那麼right先走到第3 - 1個節點&[2]
/// 那麼right指標向前走到其下乙個節點為null時, left節點既是倒數第k個節點
/// 此時兩個指標相差為k - 1
/// 1 -> 2 -> 3 -> 4 -> 5
/// 比如要走倒數第3個節點
/// 那麼right先走到第3個節點&[2]
/// 那麼right指標向前走到鍊錶尾部為null時, left節點既是倒數第k個節點
/// 此時兩個指標相差為k
class solution
unsigned
int i = 0;
listnode *right = plisthead;
// left指標先向前走k步
while(i < k && right != null)
if(right == null && i < k)
listnode *left = plisthead;
while(right != null)
return left;
}};
當然也可以第乙個指標right先向前走k-1步,然後left和right一起走,此時兩個指標差別k-1步,那麼當right走到鍊錶尾部的前乙個結點時候的,left指向的就是倒數第k個節點
/// 1 -> 2 -> 3 -> 4 -> 5
/// 比如要走倒數第3個節點
/// 那麼right先走到第3 - 1個節點&[2]
/// 那麼right指標向前走到其下乙個節點為null時, left節點既是倒數第k個節點
/// 此時兩個指標相差為k - 1
/// 因此right需要走到鍊錶尾部前乙個結點
/// 1 -> 2 -> 3 -> 4 -> 5
/// 比如要走倒數第3個節點
/// 那麼right先走到第3個節點&[2]
/// 那麼right指標向前走到鍊錶尾部為null時, left節點既是倒數第k個節點
/// 此時兩個指標相差為k
/// 因此right需要走到鍊錶尾部前
class solution
unsigned
int i = 0;
listnode *right = plisthead;
// left指標先向前走k - 1步
while(i < k - 1 && right != null)
if(right == null)
listnode *left = plisthead;
while(right->next != null)
return left;
}};
劍指offer 015(二進位制中1的個數)
劍指offer 目錄索引 問題描述 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如 把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2 思路1 求二進位制1的個數,首先想到操作符 按位與 規則 0 1 1 1 1 1 採用 的規則,對應的二進位制位 1,並統計...
劍指offer 鍊錶中倒數第k個結點(鍊錶)
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。分析 兩個指標pointresult和pointend一起指向頭結點,然後根據k,移動pointend,使pointresult和pointend的距離為k 1。然後同時移動pointresult和pointend,當pointend指向最後乙個結點時,po...
劍指offer 鍊錶
單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...