剑指offer—第三章高质量代码(o(1)时间删除链表节点)

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

思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也是尾节点的情况。

C++代码:

#include<iostream>
using namespace std;
struct ListNode
{
    int m_nValue;
    ListNode* m_pNext;
};
//创建链表
ListNode* CreateLink(int a[],int k)
{
    ListNode* Head=NULL,*q=NULL;
    for(int i=0;i<k;i++)
    {
        ListNode * pNew=new ListNode();
        pNew->m_nValue=a[i];
        pNew->m_pNext=NULL;
        if(Head==NULL)
        {
            Head=pNew;
            q=pNew;
        }
        else
        {
            q->m_pNext=pNew;
            q=q->m_pNext;
        }  

    }
    return Head;
}
//从头到尾打印列表
void printLink(ListNode * pHead)
{
    ListNode *p=pHead;
    while(p)
    {
        cout<<p->m_nValue<<" ";
        p=p->m_pNext;
    }
    cout<<endl;
}
void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted)
{
    if(!pListHead||!pToBeDeleted)
    {
        return;
    }
    //要删除的节点后面有节点
    if(pToBeDeleted->m_pNext!=NULL)
    {
        ListNode* pNext=pToBeDeleted->m_pNext;
        pToBeDeleted->m_nValue=pNext->m_nValue;
        pToBeDeleted->m_pNext=pNext->m_pNext;
        delete pNext;
        pNext=NULL;
    }
    //要删除的节点是头结点,也是最后一个节点
    else if(*pListHead==pToBeDeleted)
    {
        delete pToBeDeleted;
        pToBeDeleted=NULL;
        *pListHead=NULL;
    }
    else
    {
        ListNode* pNode=*pListHead;
        while(pNode->m_pNext!=pToBeDeleted)
        {
            pNode=pNode->m_pNext;

        }
        pNode->m_pNext=NULL;
        delete pToBeDeleted;
        pToBeDeleted=NULL;
    }
}
void main()  

{
    int a[]={1,2,3};
    ListNode * Head=CreateLink(a,3);
    printLink(Head);
    ListNode* pNode=Head;
    while(pNode->m_nValue!=a[1]&&pNode)
        pNode=pNode->m_pNext;
    if(!pNode)
    {
        printf("不存在这样的节点");
    }
    else
        DeleteNode(&Head,pNode);
    printLink(Head);
    cout<<endl;
} 

Java代码:

public class SingleLinkList {
    public  static class ListNode
    {
        public int m_nValue;
        public ListNode m_pNext;
    }
    //创建链表
    public  static ListNode CreateLink(int a[],int k)
    {
        ListNode Head=null,q=null;
        for(int i=0;i<k;i++)
        {
            ListNode  pNew=new ListNode();
            pNew.m_nValue=a[i];
            pNew.m_pNext=null;
            if(Head==null)
            {
                Head=pNew;
                q=pNew;
            }
            else
            {
                q.m_pNext=pNew;
                q=q.m_pNext;
            }  

        }
        return Head;
    }
    //从头到尾打印列表
    public static  void printLink(ListNode pHead)
    {
        ListNode p=pHead;
        while(p != null)
        {
            System.out.print(p.m_nValue+" ");
            p=p.m_pNext;
        }
        System.out.println("\n");
    }
    public static void DeleteNode(ListNode pListHead,ListNode pToBeDeleted)
    {
        if(pListHead==null||pToBeDeleted==null)
        {
            return;
        }
        //要删除的节点后面有节点
        if(pToBeDeleted.m_pNext!=null)
        {
            ListNode pNext=pToBeDeleted.m_pNext;
            pToBeDeleted.m_nValue=pNext.m_nValue;
            pToBeDeleted.m_pNext=pNext.m_pNext;

        }
        //要删除的节点是头结点,也是最后一个节点
        else if(pListHead==pToBeDeleted)
        {

            pToBeDeleted=null;
            pListHead=null;
        }
        else
        {
            ListNode pNode=pListHead;
            while(pNode.m_pNext!=pToBeDeleted)
            {
                pNode=pNode.m_pNext;

            }
            pNode.m_pNext=null;

            pToBeDeleted=null;
        }
    }
    public static void main(String[] args)  

    {
        int a[]={1,2,3};
        ListNode  Head=CreateLink(a,3);
        printLink(Head);
        ListNode pNode=Head;
        while(pNode.m_nValue!=a[1]&&pNode!=null)
            pNode=pNode.m_pNext;
        if(pNode==null)
        {
            System.out.println("不存在这样的节点");
        }
        else
            DeleteNode(Head,pNode);
        printLink(Head);
        System.out.println("\n");
    } 

}
时间: 2024-08-06 07:57:52

剑指offer—第三章高质量代码(o(1)时间删除链表节点)的相关文章

剑指offer—第三章高质量代码(合并两个排序链表)

题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1->mValue比Head2->mValue小,那么头节点,就是Head1,递归实现后面的节点的排序. C++代码: #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNex

剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位的,高位补0.打印字符串的时候要对数字进行判断,不要将高位的0打印出来.打印字符串的结束条件是,当最高位产生进位时结束. c++代码: #include<iostream> using namespace std; //字符串模拟加法 bool Increment(char* number) {

剑指offer-第三章高质量代码(树的子结构)

题目:输入两个二叉树A和B,判断B是不是A的子结构. 思路:遍历A树找到B树的根节点,然后再判断左右子树是否相同.不相同再往下找.重复改过程. 子结构的描述如下图所示: C++代码: #include<iostream> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* Construct

剑指offer第4章

包含 \(min\) 函数的栈 ? 利用辅助栈,把每次的最小者(之前的最小元素和新压入栈的元素的两者中的较小值)都保存起来放到另一个辅助栈中. ? 栈的压入.弹出序列 ? 总结上述入栈.出栈的过程,我们可以找到判断个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出. 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压 入辅助栈,直到把下一个需要弹出的数字压入栈顶为止.如果所有的数字 都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列

剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)

题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next!=null,则同时移动P1和p2.直到p1指向最后一个节点.此时,P2指向倒数第k个节点. C++代码: #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNext; }; Li

剑指offer第2章学习(2)

各种排序算法都有各自的使用范围.例如快速排序,如果数组本身已经排好序了,那么再使用它进行排序工作量为 O(n^2). //对公司所有员工的年龄进行排序 //假定,所有员工的年龄从15岁到60岁不等 //非常简单,没什么可说的 void SortAge(int data[], int length) { const int Youngest = 15, Oldest = 60; if (data == NULL || length <= 0) return; int Age[Oldest - Yo

剑指offer第8章

正则表达式的匹配 ?

剑指offer第3章

通常有3种方式把错误信息传递给函数调用者.? 函数用返回值来告知调用者是否出错. ?在错误发生的时候设置一个全局变量 ,此时可以用返回值来传递计算结果 ?异常方式:当程序出现错误的时候就抛出一个异常. ? 3种错误信息的处理方式的优缺点 ? ? ?

剑指offer第三题 从尾到头打印链表

输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解题思路:先入栈相当于链表逆序再出栈实现链表从尾到头的顺序输出. 1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.*; 13 public class So