JZ-C-13

剑指offer第十三题:在O(1)时间内删除链表结点

  1 //============================================================================
  2 // Name        : JZ-C-13.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : 在O(1)时间内删除链表结点
  7 //============================================================================
  8
  9 #include <iostream>
 10 #include "List.h"
 11 using namespace std;
 12
 13 /*typedef struct ListNode {
 14  int value;
 15  ListNode* next;
 16  } NODE;*/
 17
 18 void DeleteNode(ListNode** HeadNode, ListNode* ToBeDeleted) {
 19     if (!HeadNode || !ToBeDeleted) {
 20         return;
 21     }
 22     if (ToBeDeleted->m_pNext != NULL) { // 要删除的结点不是尾结点
 23         ListNode* p = ToBeDeleted->m_pNext;
 24         ToBeDeleted->m_nValue = p->m_nValue;
 25         ToBeDeleted->m_pNext = p->m_pNext;
 26         delete p;
 27         p = NULL;
 28     } else if (*HeadNode == ToBeDeleted) { // 链表只有一个结点,删除头结点(也是尾结点)
 29         delete ToBeDeleted;
 30         ToBeDeleted = NULL;
 31         *HeadNode = NULL;
 32     } else { // 链表中有多个结点,删除尾结点
 33         ListNode* p = *HeadNode;
 34         while (p->m_pNext != ToBeDeleted) {
 35             p = p->m_pNext;
 36         }
 37         p->m_pNext = NULL;
 38         delete ToBeDeleted;
 39         ToBeDeleted = NULL;
 40     }
 41
 42 }
 43 // ====================测试代码====================
 44 void Test(ListNode* pListHead, ListNode* pNode) {
 45 //    printf("The original list is: \n");
 46     cout << "The original list is:" << endl;
 47     PrintList(pListHead);
 48
 49 //    printf("The node to be deleted is: \n");
 50     cout << "The node to be deleted is:" << endl;
 51     PrintListNode(pNode);
 52
 53     DeleteNode(&pListHead, pNode);
 54 //    printf("The result list is: \n");
 55     cout << "The result list is:" << endl;
 56     PrintList(pListHead);
 57 }
 58
 59 // 链表中有多个结点,删除中间的结点
 60 void Test1() {
 61     ListNode* pNode1 = CreateListNode(1);
 62     ListNode* pNode2 = CreateListNode(2);
 63     ListNode* pNode3 = CreateListNode(3);
 64     ListNode* pNode4 = CreateListNode(4);
 65     ListNode* pNode5 = CreateListNode(5);
 66
 67     ConnectListNodes(pNode1, pNode2);
 68     ConnectListNodes(pNode2, pNode3);
 69     ConnectListNodes(pNode3, pNode4);
 70     ConnectListNodes(pNode4, pNode5);
 71
 72     Test(pNode1, pNode3);
 73
 74     DestroyList(pNode1);
 75 }
 76
 77 // 链表中有多个结点,删除尾结点
 78 void Test2() {
 79     ListNode* pNode1 = CreateListNode(1);
 80     ListNode* pNode2 = CreateListNode(2);
 81     ListNode* pNode3 = CreateListNode(3);
 82     ListNode* pNode4 = CreateListNode(4);
 83     ListNode* pNode5 = CreateListNode(5);
 84
 85     ConnectListNodes(pNode1, pNode2);
 86     ConnectListNodes(pNode2, pNode3);
 87     ConnectListNodes(pNode3, pNode4);
 88     ConnectListNodes(pNode4, pNode5);
 89
 90     Test(pNode1, pNode5);
 91
 92     DestroyList(pNode1);
 93 }
 94
 95 // 链表中有多个结点,删除头结点
 96 void Test3() {
 97     ListNode* pNode1 = CreateListNode(1);
 98     ListNode* pNode2 = CreateListNode(2);
 99     ListNode* pNode3 = CreateListNode(3);
100     ListNode* pNode4 = CreateListNode(4);
101     ListNode* pNode5 = CreateListNode(5);
102
103     ConnectListNodes(pNode1, pNode2);
104     ConnectListNodes(pNode2, pNode3);
105     ConnectListNodes(pNode3, pNode4);
106     ConnectListNodes(pNode4, pNode5);
107
108     Test(pNode1, pNode1);
109
110     DestroyList(pNode1);
111 }
112
113 // 链表中只有一个结点,删除头结点
114 void Test4() {
115     ListNode* pNode1 = CreateListNode(1);
116
117     Test(pNode1, pNode1);
118 }
119
120 // 链表为空
121 void Test5() {
122     Test(NULL, NULL);
123 }
124
125 int main(int argc, char** argv) {
126     Test1();
127     Test2();
128     Test3();
129     Test4();
130     Test5();
131
132     return 0;
133 }
时间: 2024-12-24 07:05:37

JZ-C-13的相关文章

poj 3613 Cow Relays(矩阵的图论意义)

题解 用一个矩阵来表示一个图的边的存在性,即矩阵C[i,j]=1表示有一条从i到j的有向边C[i,j]=0表示没有从i到j的边.这个矩阵的k次方后C[i,j]就表示有多少条从i到j恰好经过k条边的路径. 在此题中我们赋予边权值并把矩阵乘法中的+改为min这样这个矩阵的k次方后C[i,j]就表示从i到j恰好经过k条边的最短路径. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include&l

python 各模块

01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支持模块 12 _ _builtin_ _ 模块 121 使用元组或字典中的参数调用函数 1211 Example 1-1 使用 apply 函数 1212 Example 1-2 使用 apply 函数传递关键字参数 1213 Example 1-3 使用 apply 函数调用基类的构造函数 122

转:Python标准库(非常经典的各种模块介绍)

Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块

XoftSpy 4.13的注册算法分析

[标题]XoftSpy 4.13的注册算法分析 [作者]forever[RCT] [语言]VC [工具]ida4.6,ollydbg1.1 [正文]       这个软件的算法很简单,正好拿来做逆向分析.我就会捏软柿子.呵呵.       因为这个软件注册失败会弹出一个对话框来提示您,所以在ollydbg中在函数MessageBox上下断点很容易就找到软件的关键算法处.这个软件装载时间很长,所以如果您也要分析它,建议用ollydbg来attach一下.我就是这么的.:)       其他的都省略

13.Linux键盘按键驱动 (详解)

版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L.S.空格键.回车键 1.先来介绍以下几个结构体使用和函数,下面代码中会用到 1)input_dev驱动设备结构体中常用成员如下: struct input_dev { void *private; const char *name; //设备名字 const char *ph

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

RedHat6.6上安装MySQL5.7.13

由于公司需要更换新的架构,将采用MySQL5.7作为数据库的主要版本,下面将全面介绍在RedHat6.6上二进制安装MySQL5.7.13.后期也将依次介绍在MySQL5.7上的运维管理及优化. 1.下载MySQL5.7.13安装包 下载地址如下,现在的MySQL5.7稳定版已更新到5.7.14 http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2.5-x86_64.tar.gz 2.新建MySQL用户和组

第20章 异常和状态管理20.7-20.13

20.7用可靠性换取开发效率 面向对象编程,编译器功能,CLR功能以及庞大的类库——使.Net Framework成为一个颇具吸引力的开发平台.但所有的这些东西,都会在你的代码中引入你没有什么控制权的“错误点”,如果 OutOfMemoryExcepton等.程序开发不可能对这些异常进行一一捕捉,让应用程序变得绝对健壮.意料意外的异常往往造成程序状态的破坏,为 了缓解对状态的破坏,可以做下面几件事: ●执行catch或finally块时,CLR不允许终止线程,所以可以向下面这样写是Transfe

12.13周记

周数 专业学习目标 专业学习时间 新增代码量 博客发表量 人文方面的学习 知识技能总结 12.13 12.13周web网页制作学习 12周7小时: 13周9小时: 12周300行: 13周400行: 一共发表4篇博客 12.13周<三国志> 12周web中的js应用: 13周C语言的二叉树,以及web中css的应用:

2016年4月13日作业

一.外包管理 1.外包的形式有哪五种?什么是利益关系? 活动外包.服务外包.内包.合包.利益关系 利益关系是一种长期的合作关系,双方先为此关系进行投资,再根据预先拟定的协议分享利益,共同承担风险,同时共享利益. 2.外包管理的目标是什么?要实现这个目标,对外包管理提出哪四个方面的要求? 软件外包管理的总的目标是用强有力的手段来管理同时进行的众多外包项目,满足进度.质量.成本的要求.要实现这个目标就对外包管理提出了以下四方面的要求. 1)慎重选择合格的软件承包商; 2)互相同意对方的承诺; 3)需