剑指offer之C++语言实现链表(两种删除节点方式)

简介: 剑指offer之C++语言实现链表(两种删除节点方式)

1 问题

用C++语言实现链表

2 代码实现

#include <iostream>
#include <stdlib.h>
using namespace std;
class List
{
public:
  List();
  ~List();
  List* createNode(int value);//创建节点
  bool insertNode(List *node);//插入节点
  void printList();//打印节点
  bool deleteNode(List *node);//删除节点不移动头节点
  bool deleteNode1(List *node);//删除节点移动头节点
  int listSize();//长度
  void printNode();//打印但前的value
  void freeList();//释放链表
private:
  int value;
  List *head;
  List *next;
};
bool List::deleteNode(List *node)
{
  if (node == NULL)
  {
    std:cout << "node is NULL" << std::endl;  
    return false;
  }
  if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl; 
    return false;
  }
  //如果node等于head
  if (head == node)
  {
    head = head->next;
  }
  List *p = head;
  while (p->next != NULL)
  {
    if (p->next == node)
    {
      p->next = p->next->next;
      return true;
    }
    p = p->next;
  }
  return false; 
}
bool List::deleteNode1(List *node)
{
  if (node == NULL)
  {
    std:cout << "node is NULL" << std::endl;  
    return false;
  }
  if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl; 
    return false;
  }
  //如果node等于head
  if (head == node)
  {
    head = head->next;
  }
  List *p = head;
  while (head->next != NULL)
  {
    if (head->next == node)
    {
      head->next = head->next->next;
      std::cout << "delete node success head->value" << head->value << std::endl;
      //这里要记得把头节点的指针移动最后还原,这里的头节点是保存在这个类里面,改变了就是改变了
      //如果这里是把head作为参数传递,最后head会被销毁那么不需要移动头指针
      head = p;
      return true;
    }
    //注意,这里由于head是成员变量,改变了就是改变了,所以需要最后重新指定
    head = head->next;
  }
  std::cout << "delete node fail head->value" << head->value << std::endl;
  //这里要记得把头节点的指针移动最后还原,这里的头节点是保存在这个类里面,改变了就是改变了
  //如果这里是把head作为参数传递,最后head会被销毁那么不需要移动头指针
  head = p;
  return false; 
}
List::List()
{
  value = 0;
  head = NULL;
  next = NULL;
}
List::~List()
{
  delete head;
  delete next;
}
List* List::createNode(int value)
{
  List *list = NULL;
  list = new List();
  if (list)
  {
    list->value = value;
    return list;  
  }
  return NULL;
}
bool List::insertNode(List *node)
{
  node->next = head;
  head = node;
  return true;  
}
void List::printList()
{ if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl;
    return;
  }
  List *p = head;
  while (p != NULL)
  {
    std::cout << p->value << std::endl; 
    p = p->next;
  }
  return; 
}
void List::printNode()
{
  std::cout << value << std::endl;  
}
int List::listSize()
{
  if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl;
    return 0; 
  }
  int len = 0;
  List *p = head;
  while (p != NULL)
  {
    p = p->next;
    ++len;
  }
  return len;
}
void List::freeList()
{
  if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl;
    return; 
  }
  List *p;
  while (head != NULL)
  {
    p = head;
    head = head->next;
    free(p);
  }
}
int main()
{
  List list;
  List *list1 = list.createNode(5);
  list.insertNode(list1);
  List *list2 = list.createNode(6);
  list.insertNode(list2);
  List *list3 = list.createNode(1);
  list.insertNode(list3);
  List *list4 = list.createNode(3);
  list.insertNode(list4);
  List *list5 = list.createNode(2);
  list.insertNode(list5);
  list.printList();
  std::cout << "list size is " << list.listSize() << std::endl;
  std::cout << "-----------开始删除节点值为3的节点" << std::endl;
  list.deleteNode1(list4);
  list.printList();
  std::cout << "list size is " << list.listSize() << std::endl;
  list.freeList();
  list.printList();
  return 0; 
}

3 运行结果

2
3
1
6
5
list size is 5
-----------开始删除节点值为3的节点
delete node success head->value2
2
1
6
5
list size is 4
head is NULL
相关文章
|
3月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
76 2
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
82 0
|
1月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
37 5
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
18 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
49 0
|
1月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2
|
1月前
|
编译器 Linux C语言
深入计算机语言之C++:C到C++的过度-1
深入计算机语言之C++:C到C++的过度-1
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点