12.給定單向鏈表的頭指針和一個節點的指針,定義一個函數在O(1)時間刪除該節點。
O(n):從頭遍歷到指定節點的前一個節點pre,然後將pre的next指向指定節點的下一個,刪除指定節點即可
O(1):將指定節點的下一個節點中的值複製到指定節點,並刪除下一節點
注:1.如果要刪除的是尾節點,沒有下一節點。則需要從頭節點開始,順序遍歷的到該節點的前一節點,完成刪除操作
2.如果鏈表中只有一個節點,刪除節點後,要把鏈表的頭節點設爲null
public class javatest{
public static class ListNode {
int value; // 保存鏈表的值
ListNode next; // 下一個結點
}
public static ListNode deleteNode(ListNode head, ListNode toBeDeleted) {
// 如果輸入參數有空值就返回表頭結點
if (head == null || toBeDeleted == null) {
return head;
}
// 如果刪除的是頭結點,直接返回頭結點的下一個結點
if (head == toBeDeleted) {
return head.next;
}
// 下面的情況鏈表至少有兩個結點
// 在多個節點的情況下,如果刪除的是最後一個元素
if (toBeDeleted.next == null) {
// 找待刪除元素的前驅
ListNode tmp = head;
while (tmp.next != toBeDeleted) {
tmp = tmp.next;
}
// 刪除待結點
tmp.next = null;
}
// 在多個節點的情況下,如果刪除的是某個中間結點
else {
// 將下一個結點的值輸入當前待刪除的結點
toBeDeleted.value = toBeDeleted.next.value;
// 待刪除的結點的下一個指向原先待刪除引號的下下個結點,即將待刪除的下一個結點刪除
toBeDeleted.next = toBeDeleted.next.next;
}
// 返回刪除節點後的鏈表頭結點
return head;
}
public static void printList(ListNode head) {
while (head != null) {
System.out.print(head.value + "->");
head = head.next;
}
System.out.println("null");
}
public static void main(String[] args) {
ListNode head = new ListNode();
head.value = 1;
head.next = new ListNode();
head.next.value = 2;
head.next.next = new ListNode();
head.next.next.value = 3;
head.next.next.next = new ListNode();
head.next.next.next.value = 4;
ListNode middle = head.next.next.next.next = new ListNode();
head.next.next.next.next.value = 5;
head.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.value = 6;
head.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.value = 7;
head.next.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.next.value = 8;
ListNode last = head.next.next.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.next.next.value = 9;
head = deleteNode(head, null); // 刪除的結點爲空
printList(head);
ListNode node = new ListNode();
node.value = 12;
head = deleteNode(head, head); // 刪除頭結點
printList(head);
head = deleteNode(head, last); // 刪除尾結點
printList(head);
head = deleteNode(head, middle); // 刪除中間結點
printList(head);
head = deleteNode(head, node); // 刪除的結點不在鏈表中
printList(head);
}
}
輸出結果:
null
2->3->4->5->6->7->8->9->null
2->3->4->5->6->7->8->null
2->3->4->6->7->8->null