List链表模板类的简单实现(部分方法递归操作)

善哉。

此篇博客,旨在剖析下操作单链表时的递归思想。望各位施主笑纳。

1. 递归删除结点

* 空链表 - 直接返回

* 非空,若未找到待删除元素,递归。若找到,删除节点,返回尾链头

* 回溯,衔接形成新链

 1   _Node* myErase_R(const Object& elem, _Node* curr){
 2         //空链 或 无此元素
 3         if (curr == NULL) return NULL;
 4
 5         if (curr->elem == elem){
 6             _Node* tmp = curr->next;
 7                 delete curr;
 8             return tmp;
 9         }
10
11         curr->next = myErase_R(elem, curr->next);
12         return curr;
13     }

  2. 递归逆置

操作链表的递归思想,大体上是基于用递归将链表分割成多个分结点,当找到符合条件的结点时,进行操作后回溯。

   链表逆置的符合条件结点是尾结点,操作是逆置next指针。

   思路明朗后,便可模仿链表递归删除的方法,实现递归逆置链表。

 1 void myReverse_R(_Node*& curr){
 2         //空链表
 3          if (curr == NULL) return ;
 4
 5          //将链表分割  ->|___|(first)        ->|___|->|___|->|___| ... (rest)
 6          _Node* first = curr;
 7          _Node* rest = first->next;
 8
 9          //递归终止条件
10          if (rest == NULL)
11             return ;
12
13          myReverse_R(rest);
14
15          //回溯 逆置
16          first->next->next = first;
17          first->next = NULL;
18
19          //改变链头
20          curr = rest;
21       }

下面给出测试代码。

 1 void myReverse_R(_Node*& curr){
 2         //空链表
 3          if (curr == NULL) return ;
 4
 5          //将链表分割  ->|___|(first)        ->|___|->|___|->|___| ... (rest)
 6          _Node* first = curr;
 7          _Node* rest = first->next;
 8
 9          //递归终止条件
10          if (rest == NULL)
11             return ;
12
13          myReverse_R(rest);
14
15          //回溯 逆置
16          first->next->next = first;
17          first->next = NULL;
18
19          //改变链头
20          curr = rest;
21       }

List

此小篇就这么优雅的完成了~

时间: 2024-07-30 19:15:58

List链表模板类的简单实现(部分方法递归操作)的相关文章

C++ 单链表模板类实现

单链表的C语言描述 基本运算的算法--置空表.求表的长度.取结点.定位运算.插入运算.删除运算.建立不带头结点的单链表(头插入法建表).建立带头结点的单链表(尾插入法建表),输出带头结点的单链表 #include<cstdio>#include<iostream>using namespace std;template <class T>class Linklist{private: struct node { T date; node * next; node():n

C++数据结构 单链表(模板类)

利用模板类实现单链表及其功能 需要实现的操作: [1] push_back       [2] push_front [3] show_list       [0] quit_system [4] pop_back        [5] pop_front [6] insert_val      [7] delete_val [8] find            [9]length [10] clear          [11]destroy [12] reserv         [13]

c++模板类学习简单

1.模板的概念 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本. //函数1. int max(int x,int y) {  return(x>y)?x:y ; } //函数2. float max( float x,float y) {  return (x>y)? x:y ; } //函数3. d

C++链表模板类

思想和上篇文章差不多,只是换了层包装. 直接上代码: // linklist.h #include <iostream> #include <cstdio> using namespace std; template <typename T> struct Node { T t; Node<T> *next; }; template <typename T> class LinkList { public: LinkList(); ~LinkLi

单链表(模板类)

#include<iostream>#include<assert.h>using namespace std; template <class T>struct Node{ Node(const T& x) :_data(x) , _pNext(NULL) { } Node<T> *_pNext; T _data;};template <class T>class SList{public: SList() :_pHead(NULL)

C++ 数据结构 双链表(模板类)

#ifndef DLIST_H_INCLUDED #define DLIST_H_INCLUDED #include<iostream> using namespace std; template<class Type> class DList; template<class Type> class ListNode { friend class DList<Type>; public: ListNode():data(Type()),next(NULL),

学艺不精而羞愧--论C++模板类的使用

自己断断续续地使用C++也有一段时间了,有些时候产生了自满的情绪,认为自己对C++的语言特性已经知道的差不多了,在语法方面没有什么难倒我的地方了,现在所要做的是根据实际问题编写程序,问题的难点在于算法的设计和分析,在于解决问题的策略了.然而今天下午的一次经历给自己当头一棒:永远不要自满,要保持一颗谦虚的学习的心. 1 问题的产生 我在实现[书][1]中219页的list的contiguous结构时,按照我的惯性,写了两个文件:rblist.h和rblist.cpp,分别为类定义和方法的具体实现.

浅谈JavaEE中的JDBC模板类的封装实现以及合理的建立项目包结构(一)

从今天开始我们一起来聊下有关,javaEE开发中的一些知识,JavaEE的开发用于企业级的开发,但是现在企业中一般也不会使用JDBC开发,大部分都是使用自己公司开发的一套的框架,但是这些框架的架构一般也是会模仿着有名JavaEE开源三大开发框架SSH(Struts2+Spring+Hibernate)或者现在也很流行的SSM开发框架(Spring+SpringMVC+MyBatis) 来进行深度定制以便于适合自己企业的实际开发需求.有的人曾说既然去公司又是重新学习一套框架,还有必要学习开源的三大

9.SpringJDBC模板类

1. Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 2. 提供了JDBC模板,Spring框架提供的 * JdbcTemplate类 3. Spring框架可以整合Hibernate框架,也提供了模板类 * HibernateTemplate类快速入门 1. 步骤一:创建数据库的表结构 create database spring_day03; use spring_day03; create table t_account( id int primary