zoukankan      html  css  js  c++  java
  • 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: 
     
  • 相关阅读:
    2017.3.11[bzoj2440][中山市选2011]完全平方数
    2017.3.6[hihocoder#1415]后缀数组三·重复旋律3
    2017.3.4[hihocoder#1407]后缀数组二·重复旋律2
    [NOI2013]快餐店
    [HNOI2014]米特运输
    [HNOI2015]亚瑟王
    [JLOI2013]卡牌游戏
    [SDOI2010]地精部落
    [ZJOI2007]棋盘制作
    [AHOI2009]中国象棋
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4924174.html
Copyright © 2011-2022 走看看