【題目】
給定鍊錶的頭節點head,實現刪除鍊錶的中間節點的函式。
例如:鍊錶為空或長度為1,不刪除任何節點;
1 -> 2,刪除節點1;
1 -> 2 -> 3,刪除節點2;
1 -> 2 -> 3 -> 4,刪除節點2;
1 -> 2 -> 3 -> 4 -> 5,刪除節點3;
高階:給定鍊錶的頭節點head、整數a和b,實現刪除位於a/b處節點的函式。
例如:鍊錶:1 -> 2 -> 3 -> 4 -> 5,假設a/b的值為r。
如果r等於0,不刪除任何節點;
如果r在區間(0,1/5]上,刪除節點1;
如果r在區間(1/5,2/5]上,刪除節點2;
如果r在區間(2/5,3/5]上,刪除節點3;
如果r在區間(3/5,4/5]上,刪除節點4;
如果r在區間(4/5,1]上,刪除節點5;
如果r大於1,不刪除任何節點。
【解答1】
分析原問題,如果鍊錶為空或者長度為1,,不需要調整,則直接返回;如果鍊錶的長度為2,將頭節點刪除即可;當鍊表長度到達3,應該刪除第2個節點;當鍊表的長度為4,應該刪除第2個節點;當鍊表的長度為5,應該刪除第3個節點……也就是鍊錶長度每增加2(3,5,7……),要刪除的節點就後移乙個節點。
【**實現1】
struct node
};static node *removemidnode(node *head)
if (head->next->next == nullptr)
node *pre = head;
node *cur = head->next->next;
while (cur->next != nullptr && cur->next->next != nullptr)
pre->next = pre->next->next;
return head;
}
【解答2】
對於高階問題,如何根據鍊錶的長度n,以及a與b的值決定該刪除的節點是哪乙個節點。根據如下方法:先計算double r = ((double)(a*n)) / ((double)b)的值,然後r向上取整後的整數值代表該刪除的節點是第幾個節點。
【**實現2】
static node *removebyratio(node *head, int a, int b)
int n = 0;
node *cur = head;
while (cur != nullptr)
n = ceil((double)(a * n) / b);
if (n == 1)
if (n > 1)
cur->next = cur->next->next;
} return head;
}
【**】
《程式設計師**面試指南(it名企演算法與資料結構題目最優解)》左程雲
鍊錶問題 刪除鍊錶的中間節點和a b處的節點
問題描述 給定鍊錶的頭節點head,實現刪除鍊錶的中間節點的方法 若為偶數個 比如1234則刪除節點2 給定鍊錶的頭節點head,實現刪除鍊錶的a b處節點的方法 思路分析 刪除中間節點 1個節點,不刪除 2個節點,刪除節點1 3個節點,刪除節點2 4個節點,刪除節點2 5個節點,刪除節點3 6個節...
鍊錶中間節點
題目 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode ...
LeetCode 鍊錶 鍊錶的中間節點
給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode 型別的物件...