刪除鍊錶的中間節點和a b處節點

2021-07-12 06:37:16 字數 1654 閱讀 7298

[說明]:

本文是左程雲老師所著的《程式設計師面試**指南》第二章中「

刪除鍊錶的中間節點和a/b處節點

」中的一道題目。

在此感謝左程雲老師。

[題目]:

給定鍊錶的頭節點 head,實現刪除鍊錶的中間節點的函式。

例如:步刪除任何節點;

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,不刪除任何節點。

[思路]:

對於刪除中間節點的問題:根據題意可知,鍊錶長度每增加2(3,5,7......),要刪除的節點就後移乙個節點。設定兩個指標,乙個指標每次向前走一步,另乙個向前走兩步。

對於刪除 a/b 節點問題:((double) (a * n)) / (double) b  向上取整之後的整數值代表該刪除的節點是第幾個節點。

仔細體會煉表裡的思想,還是蠻不錯的。

package zcy_2;

public class removenodebyratio

} public static node removemidnode(node head)

if (head.next.next == null)

node pre = head;

node cur = head.next.next;

while (cur.next != null && cur.next.next != null)

pre.next = pre.next.next;

return head;

} public static node removebyratio(node head, int a, int b)

int n = 0;

node cur = head;

while (cur != null)

n = (int) math.ceil(((double) (a * n)) / (double) b);

if (n == 1)

if (n > 1)

cur.next = cur.next.next;

} return head;

} public static void printlinkedlist(node head)

system.out.println();

} public static void main(string args)

}

刪除鍊錶的中間節點和a b處的節點

給定鍊錶的頭節點head,實現刪除鍊錶中間節點的函式和刪除位於a b處節點的函式。當有偶數個節點時,刪除兩個中間節點的前乙個,有奇數個節點時,刪除中間節點。刪除a b處的節點 鍊錶1 2 3 4 5,假設a b的值為r,如果r 0,不刪除任何節點。如果r在區間 0,1 5 上,刪除節點1 依次類推 ...

鍊錶問題 刪除鍊錶的中間節點和a b處的節點

問題描述 給定鍊錶的頭節點head,實現刪除鍊錶的中間節點的方法 若為偶數個 比如1234則刪除節點2 給定鍊錶的頭節點head,實現刪除鍊錶的a b處節點的方法 思路分析 刪除中間節點 1個節點,不刪除 2個節點,刪除節點1 3個節點,刪除節點2 4個節點,刪除節點2 5個節點,刪除節點3 6個節...

鍊錶問題03 刪除鍊錶的中間節點和a b處的節點

題目 給定鍊錶的頭節點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 ...