P99、面试题13:在o(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在o(1)时间删除该结点。链表结点与函数的定义如下:
struct ListNode{
       int m_nValue;
       ListNode *m_pNext;    
}
void DeleteNode(Listnode** pListHead, ListNode* pToBeDeleted);

思路:将要删除的结点的下一个结点的值复制到要删除的结点,删除下一个结点。如果是要删除最后一个结点,则要从头开始搜索。
 
测试用例:
1)功能测试(从有多个结点的链表的中间删除一个结点,从有多个结点的链表中删除头结点,从有多个结点的链表中删除尾结点,从只有一个结点的链表中删除唯一的结点)
2)特殊输入测试(指向链表头结点指针的为null指针,指向要删除的结点为null指针)
 
代码实现:
结点类:
package com.yyq;

/**
 * Created by Administrator on 2015/9/13.
 */
public class ListNode {
    private int  m_nValue;
    private ListNode m_pNext;

    public ListNode(int m_nValue){
        this.m_nValue = m_nValue;
    }

    public ListNode getM_pNext() {
        return m_pNext;
    }

    public void setM_pNext(ListNode m_pNext) {
        this.m_pNext = m_pNext;
    }

    public int getM_nValue() {
        return m_nValue;
    }

    public void setM_nValue(int m_nValue) {
        this.m_nValue = m_nValue;
    }
}

实现类:

package com.yyq;

/**
 * Created by Administrator on 2015/9/13.
 */
public class DeleteNodeInList {
    public static ListNode deleteNode(ListNode pListHead, ListNode pToBeDeleted){
        if (null == pListHead || null == pToBeDeleted) {
            return pListHead;
        }
        //要删除的结点不是尾结点
        if (pToBeDeleted.getM_pNext()!= null){
            ListNode pNext = pToBeDeleted.getM_pNext();
            pToBeDeleted.setM_nValue(pNext.getM_nValue());
            pToBeDeleted.setM_pNext(pNext.getM_pNext());
            pNext = null;
        }
        //链表只有一个结点,删除头结点(也是尾结点)
        else if(pListHead == pToBeDeleted){
            pToBeDeleted = null;
            pListHead = null;
        }
        //链表中有多个结点,删除尾结点
        else{
            ListNode pNode = pListHead;
            while(pNode.getM_pNext() != pToBeDeleted){
                pNode = pNode.getM_pNext();
            }
            pNode.setM_pNext(null);
            pToBeDeleted = null;
        }
        return pListHead;
    }

    public static void printList(ListNode pListHead){
        if (pListHead == null)
            return;
        ListNode pNode = pListHead;
        while(pNode!= null){
            System.out.print(pNode.getM_nValue()+"  ");
            pNode = pNode.getM_pNext();
        }
        System.out.println();
    }
    // ====================测试代码====================
    public static void Test(ListNode pListHead, ListNode pNode)
    {
        System.out.println("The original list is: ");
        printList(pListHead);
        if (null == pListHead || null == pNode) {
            return ;
        }
        System.out.println("The node to be deleted is: " + pNode.getM_nValue());
        pListHead = deleteNode(pListHead, pNode);
        System.out.println("The result list is: ");
        printList(pListHead);
        System.out.println();
    }

   //  链表中有多个结点,删除中间的结点
    public static void  Test1()
    {
        ListNode pNode1 = new ListNode(1);
        ListNode pNode2 = new ListNode(2);
        ListNode pNode3 = new ListNode(3);
        ListNode pNode4 = new ListNode(4);
        ListNode pNode5 = new ListNode(5);
        ListNode pNode6 = new ListNode(6);

        pNode1.setM_pNext(pNode2);
        pNode2.setM_pNext(pNode3);
        pNode3.setM_pNext(pNode4);
        pNode4.setM_pNext(pNode5);
        pNode5.setM_pNext(pNode6);

        Test(pNode1, pNode3);
        pNode1 = null;
    }

    // 链表中有多个结点,删除尾结点
    public static void Test2()
    {
        ListNode pNode1 = new ListNode(1);
        ListNode pNode2 = new ListNode(2);
        ListNode pNode3 = new ListNode(3);
        ListNode pNode4 = new ListNode(4);
        ListNode pNode5 = new ListNode(5);
        ListNode pNode6 = new ListNode(6);

        pNode1.setM_pNext(pNode2);
        pNode2.setM_pNext(pNode3);
        pNode3.setM_pNext(pNode4);
        pNode4.setM_pNext(pNode5);
        pNode5.setM_pNext(pNode6);

        Test(pNode1, pNode6);
        pNode1 = null;
    }

    // 链表中有多个结点,删除头结点
    public static void Test3()
    {
        ListNode pNode1 = new ListNode(1);
        ListNode pNode2 = new ListNode(2);
        ListNode pNode3 = new ListNode(3);
        ListNode pNode4 = new ListNode(4);
        ListNode pNode5 = new ListNode(5);
        ListNode pNode6 = new ListNode(6);

        pNode1.setM_pNext(pNode2);
        pNode2.setM_pNext(pNode3);
        pNode3.setM_pNext(pNode4);
        pNode4.setM_pNext(pNode5);
        pNode5.setM_pNext(pNode6);

        Test(pNode1, pNode1);
        pNode1 = null;
    }

    // 链表中只有一个结点,删除头结点
    public static void Test4()
    {
        ListNode pNode1 = new ListNode(1);

        Test(pNode1, pNode1);
    }

    // 链表为空
    public static void Test5()
    {
        Test(null, null);
    }

    public static void main(String[] args){
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
    }
}
输出结果:
The original list is: 
1  2  3  4  5  6  
The node to be deleted is: 3
The result list is: 
1  2  4  5  6  
 
The original list is: 
1  2  3  4  5  6  
The node to be deleted is: 6
The result list is: 
1  2  3  4  5  
 
The original list is: 
1  2  3  4  5  6  
The node to be deleted is: 1
The result list is: 
2  3  4  5  6  
 
The original list is: 
1  
The node to be deleted is: 1
The result list is: 
 
The original list is: 
 
原文地址:https://www.cnblogs.com/yangyquin/p/4924174.html