[說明]:
本文是左程雲老師所著的《程式設計師面試**指南》第二章中「
刪除鍊錶的中間節點和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 ...