60.在O(1)时间内删除链表结点(链表、算法)。
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,
更重要的是,还能考察我们对时间复杂度的理解。
package com.interview.algorithm;
import com.interview.algorithm.PrintLinkReverse.LinkNode;
public class DeleteLinkNode {
public class LinkNode{
int value;
LinkNode next;
public LinkNode(int value, LinkNode next){
this.value = value;
this.next = next;
}
}
public void deleteNode(LinkNode head, LinkNode toBeDeleted){
if(head == toBeDeleted){
head = head.next;
System.out.println("Delete successful");
}else{
if(this.findNode(head, toBeDeleted))
System.out.println("Delete successful");
}
}
public boolean findNode(LinkNode curr, LinkNode toBeDeleted){
if(curr.next!=null){
if(curr.next == toBeDeleted){
curr.next = curr.next.next;
return true;
}else{
if(this.findNode(curr.next, toBeDeleted))
return true;
}
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DeleteLinkNode delete = new DeleteLinkNode();
DeleteLinkNode.LinkNode tail = delete.new LinkNode(1, null);
DeleteLinkNode.LinkNode node1 = delete.new LinkNode(2, tail);
DeleteLinkNode.LinkNode node2 = delete.new LinkNode(3, node1);
DeleteLinkNode.LinkNode node3 = delete.new LinkNode(4, node2);
DeleteLinkNode.LinkNode head = delete.new LinkNode(5, node3);
delete.deleteNode(head, head);
}
}