面试题18:在O(1)时间内删除链表节点。

 

public class DeleteNode {
    public static void main(String[] args){
        Solution18 solution18 = new Solution18();
        ListNode18 head = solution18.initLinkList(new ListNode18());
        ListNode18 toBeDeleted = head;
        while(toBeDeleted.next!=null){
            toBeDeleted=toBeDeleted.next;
        }
        solution18.printLinkList(head);
        solution18.deleteNode(head,toBeDeleted);
        solution18.printLinkList(head);
    }
}

class ListNode18{
    int value;
    ListNode18 next;
}

class Solution18{
    //初始化链表
    ListNode18 initLinkList(ListNode18 head){

        ListNode18 p=head;
        p.value=-1;
        for(int i=0; i<10; i++){
            ListNode18 nextNode = new ListNode18();
            nextNode.value=i;
            p.next=nextNode;
            p=nextNode;
        }
        return head;
    }
    //打印链表
    void printLinkList(ListNode18 p){
        while (p.next!=null){
            System.out.print(p.value+ " ");
            p=p.next;
        }
        System.out.print(p.value);
        System.out.println();
    }

    void deleteNode(ListNode18 listHead,ListNode18 toBeDeleted){

        if(listHead ==null || toBeDeleted ==null){
            return;
        }
        //如果要删除的结点不是最后一个结点
        if(toBeDeleted.next!=null){
            ListNode18 listNode18= toBeDeleted.next;
            toBeDeleted.value=listNode18.value;
            toBeDeleted.next=listNode18.next;
            listNode18.next=null;
        }else if(listHead == toBeDeleted){//链表只有一个节点
            listHead=null;
            toBeDeleted=null;
        }else{//链表有多个节点,删除尾节点
            ListNode18 p=listHead;
            while(p.next != toBeDeleted){
                p=p.next;
            }
            p.next=toBeDeleted.next;
            toBeDeleted.next=null;
        }

    }
}

 

posted @ 2018-01-21 13:00  Allen101  阅读(116)  评论(0编辑  收藏  举报