O(1)时间删除链表中的节点 13

将当下一个节点的datanextNode拷贝到当前节点,即完成删除

   

但不能用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;

   

}

posted @ 2015-04-01 20:08  keedor  阅读(117)  评论(0编辑  收藏  举报