提示
- 實現時間複雜度O(1),比如我們要刪除節點i,先把i節點的下一個節點j的內容複製到i,然後把i的指針指向節點j的下一個節點。此時再刪除節點j。
- 要注意刪除節點的位子:
- 1、是否是尾節點,不是尾節點則執行上面的思想完成刪除
- 2、如果鏈表只有一個節點,那麼直接置空頭尾節點
- 3、如果是尾節點只能遍歷全部O(n)的時間複雜度獲取到刪除的前一個節點
- 注意,java在置空的時候只能通過get()/set()改變值。
代碼實現:
public class DeleteListNode {
static class ListNode {
public Integer data;
public ListNode next;
ListNode(Integer data) {
this.data = data;
}
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public ListNode getNext() {
return next;
}
public void setNext(ListNode next) {
this.next = next;
}
}
// 時間複雜度爲O(1)的方式
public static void delNode(ListNode headNode, ListNode delNode) {
if (headNode == null || delNode == null) {
return;
}
if (delNode.next != null) { // 如果不是尾節點
ListNode nextNode = delNode.next;
delNode.data = nextNode.data;
delNode.next = nextNode.next;
} else if (delNode == headNode) { // 如果只有一個節點
headNode.setData(null); // java 改變真實值需要通過set()方法
delNode.setData(null);
} else { // 如果是尾節點
ListNode node = headNode;
while (node.next != delNode) {
node = node.next;
}
node.next = null;
}
}
public static void printListNode(ListNode headNode) {
ListNode node = headNode;
while (node != null && node.getData() != null) {
System.out.print(node.data + "->");
if (node.next == null)
System.out.print("null");
node = node.next;
}
System.out.println();
}
public static void main(String args[]) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(6);
ListNode node7 = null;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
printListNode(node1);
delNode(node1, node3);
printListNode(node1);
}
}