剑指offer——在O(1)时间删除链表结点

来源:互联网 发布:亨利保尔森 知乎 编辑:程序博客网 时间:2024/06/05 20:43

题目:给定单向链表的头指针和一个指针,定义一个函数在O(1)时间删除该结点

class Node{//创建链表类 String value; Node next;public Node(String value) {// TODO Auteo-generated constructor stubthis.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}}

通过图示展示过程:


下面请看具体代码实现:

public class Delete { public static void DeleteNode(Node Head,Node ToBeDelete){if(Head==null||ToBeDelete==null)return;//要删除的节点不是尾结点if(ToBeDelete.next!=null){//要删除的是ToBeDelete结点Node node=ToBeDelete.next;ToBeDelete.value=node.value;ToBeDelete.next=node.next;node=null;}//如果链表只有一个结点,删除头结点else if(Head==ToBeDelete){Head=null;ToBeDelete=null;}//如果要删除的是尾结点else{while(Head.next!=ToBeDelete){Head=Head.next;}Head=null;}}public static void main(String[] args) { Node head=new Node("a");       Node node1=new Node("b");       Node node2=new Node("c");       Node node3=new Node("d");    //初始化链表          head.setNext(node1);          node1.setNext(node2);          node2.setNext(node3);        System.out.println("打印链表反转后:");        DeleteNode(head,node2);        while(head!=null){        System.out.println(head.value);        head=head.next;        }}}
提示:如果面试题关于n位整数并且没有限定n的取值范围,或者是输入了任意大小的整数,那么这个题目很有可能是需要考虑大数问题的,最好使用字符串,值得注意的是,我们的代码仍然是不完整的,我们需要O(n)的时间才能判断链表中是否包含某一节点,但是受到O(1)的限制,我们不得不把确保结点在链表中的责任推给了函数DeleteNode的调用者。

阅读全文
0 0