• 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: 
     
  • 相关阅读:
    五个问题,三大策略,手把手教你定制App性能监控方案
    Oracle外部表详解 转
    EBS 一揽子采购协议 转载
    xsl特殊符号输出总结 转
    设计模式目录
    控制CPU使用率,让它画一条弧线
    C# 俄罗斯方块
    程序员能力矩阵
    如何在IIS上搭建WAP网站
    利用SQL2005的row_number()重新写了个自定义分页存储过程
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4924174.html
Copyright © 2020-2023  润新知