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: 
     
  • 相关阅读:
    WPF常用TriggerAction用法 (一)
    一个WPF只能输入数字的行为。
    自定义panel实现,并实现item更改和移除动画。
    MVVM模式下弹出窗体
    ZAM 3D 制作简单的3D字幕 流程(二)
    ZAM 3D 制作简单的3D字幕 流程(一)
    ZAM 3D 制作3D动画字幕 用于Xaml导出
    Metro Win8风格的按钮(Filp翻转)
    WPF自动隐藏的消息框(鼠标放上去将一直显示,移开动画继续),提供normal和error两种边框。
    可分组的选择框控件(MVVM下)(Toggle样式 仿造单选框RadioButton,复选框CheckBox功能)
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4924174.html
Copyright © 2011-2022 走看看