链表类题目总结

1、反转链表递归和迭代版本

原题:leetcode 206. Reverse Linked List

Reverse a singly linked list.

迭代版本:

  思路:通过举例分析可以知道,在反转其中一个链表后,会发生断裂情况,没法知道下一个链节点,需要建立三个节点,所以需要首先保存后一个节点,然后将后一个结点的next指向前一个节点,接下来依次后退,pPre=pCur;pCur=pNext。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:

//迭代版本iterator
ListNode* reverseList1(ListNode* head) {
	 if (head == nullptr)
		 return head;
	 ListNode* pNext(0), *pCur = head, *pPre(0), *pRevHead(0);
	 while (pCur != nullptr) {
		 pNext = pCur->next;//首先保存下一结点值
		 if (pNext == nullptr)
			 pRevHead = pCur;

		 pCur->next = pPre;//调整指针

		 pPre = pCur;//结点后移
		 pCur = pNext;

	 }
	 return pRevHead;
  }     

};

 递归版本:思路和迭代差不多,只不过在最后两个节点交换的时候,使用递归版本实现。递归要考虑到原函数初始定义会在后面递归的时候不断的重新定义,这里思考出现卡顿,所以引入一个辅助函数。

 ListNode* helper(ListNode* pPre, ListNode* pCur) {
	 ListNode* pNext(0), * pRevHead(0);
	 if (pCur == nullptr)
		 return pPre;
	 pNext = pCur->next;//首先保存下一结点值
	 if (pNext == nullptr)
		 pRevHead = pCur;
	 pCur->next = pPre;//调整指针
	 return  helper(pCur, pNext);
 }

 ListNode* reverseListRecur(ListNode* head) {
	 ListNode *pCur = head, *pPre(0), *pRevHead(0);

	 if (head == nullptr) {
		 return head;
	 }

	 pRevHead= helper(pPre, pCur);
	 return pRevHead;
 }

  

时间: 2024-10-10 12:31:40

链表类题目总结的相关文章

1.使用C++封装一个链表类LinkList

 使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸***********逆置链表********** LinkNode.h #ifndef LINKNODE_H #define LINKNODE_H #include <iostream> class LinkNode { public: int m_idata; LinkNode* m_pnext; }; #end

数据结构与算法系列(1)-单链表类的实现(C++)

通过定义一个C++类封装单链表这种数据结构, 封装的方法有: 1.通过输入创建单链表: 2.获取单链表的数据元素个数: 3.打印输出单链表中各个元素: 4.搜索某个元素在单链表中的位置: 5.在某个位置之后插入一个结点: 6.在某个位置删除一个节点: 7.单链表逆置: 8.单链表是否存在回环的判定: 9.单链表的升序排序: 10.两个单链表的升序合并: 11.两个单链表的降序合并. 注:单链表的排序采用的是快速排序的方法. 下面是C++写的程序代码,附运行截图. #include <iostre

爪哇国新游记之十六----泛型单链表类

/** * 单链表节点类 * @param <T> */ class Node<T extends Object>{ protected T value; protected Node next; } /** * 单链表类 * @param <T> */ public class ChainList<T extends Object>{ private Node<T> first; public void addTail(T t){ Node&l

单链表类的定义与实现

///////////////////////////////////////////////////////////////// //日期:2014-11-03 //作者:Davis //功能:单链表的定义与操作实现 ///////////////////////////////////////////////////////////////// #pragma once template<class T> struct Node { T data; //数据域,存放表元素 Node *ne

第13周 【项目 - 链表类】(2)

(2)请在下面已有代码的基础上完善程序,完成动态链表的简单操作,程序运行的截图供参考. class Student //结点类 { public: Student(int n,double s):num(n), score(s), next(NULL) {} ~Student(); Student *next; //指向下一个结点 int num; double score; }; class MyList //链表类,其中的成员是学生 { public: MyList() { head=NUL

链表类的实现及其简单功能

今天C++老师让写了一个链表的类,其中要求弄一个节点类,表示深深的力不从心.晚上无聊的时候重新想了下这个问题,感觉还可以,就敲了下. 先分块介绍下: 节点类 class node//节点类 { public: double data; node *next; }; 链表类: class Link//:链表类 { public: Link()//构造函数 { pfront=NULL; pend=NULL; } double Getx(int n);//找出第n个数字 void add(double

单链表类模板

单链表类模板节点头 ListNode.h 1 #include "stdafx.h" 2 #include<iostream> 3 using namespace std ; 4 template<typename Type> class SingleList; 5 template <typename Type> 6 class ListNode{ 7 private: 8 friend class SingleList<Type>;

双链表类模板

双链表链表节点 ListNode.h 1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 template <typename Type>class DoublyList; 6 template <typename Type> 7 // 节点信息 8 class ListNode{ 9 private: 10 friend class DoublyList<

模拟人机交互类题目

人机交互,顾名思义,就是人与计算机间的交流互动,我们对计算机的每一次操作程序中的每一条语句都是与计算机的交流,这类题目是将人和计算机调换位置,例如猜数游戏,常规的做法是让人输入数,计算机判断大还是小,而这类人机交互题目中需要你的程序充当人来输入数据,再自己来判断大小. 例题1:猜数游戏http://codeforces.com/gym/101021 分析:范围[1,1e6],二分判断.程序输出数字,我们输入大小.(这个代码是随机数). 1 #include<bits/stdc++.h> 2 u