O(1)时间删除链表中的节点 13
将当下一个节点的data和nextNode拷贝到当前节点,即完成删除
但不能用deleteNode=deleteNode.nextNode
这样是让指针循环下移
要求当前node不要后移,只要把后面的数据复制过来即可
考虑首节点为空的情况
考虑只有一个节点,删除头节点
考虑有多个节点,删除尾节点,此时需要O(n)
先循环找到deleteNode的前一个节点,让前一个节点的next置空
考虑多个节点,删除中间节点
将当下一个节点的data和nextNode拷贝到当前节点,即完成删除
package deleteNode13;
public class DeleteNode13 {
static void deleteNode(ListNode head, ListNode deleteNode) {
if (head == null) {
System.out.println("list is empty,can't delete");
return;
}
if (head.nextNode == null && deleteNode.equals(head)) {
head = null;
return;
}
if (deleteNode.nextNode == null) {
ListNode node=head;
while (node.nextNode!=deleteNode) {
node=node.nextNode;
}
node.nextNode=null;
return;
}
deleteNode.data = deleteNode.nextNode.data;
deleteNode.nextNode=deleteNode.nextNode.nextNode;
}
public static void main(String[] args) {
ListNode head=new ListNode();
ListNode second=new ListNode();
ListNode third=new ListNode();
head.nextNode=second;
second.nextNode=third;
head.data=1;
second.data=2;
third.data=3;
deleteNode(head, third);
System.out.println(head.nextNode.nextNode.data);
}
}
class ListNode {
int data;
ListNode nextNode;
}