给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来

经典题目,代码如下:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 struct ListNode {
 5     int m_iData;
 6     ListNode* m_pNext;
 7 };
 8 ListNode* Reverse(ListNode* in_pListNode) {
 9     if(in_pListNode == NULL) {
10         return NULL;
11     }else if(in_pListNode->m_pNext == NULL) {
12         return in_pListNode;
13     }
14     ListNode* t_pFirst = in_pListNode->m_pNext;
15     ListNode* t_pSecond = in_pListNode->m_pNext->m_pNext;
16     in_pListNode->m_pNext = NULL;
17     while(t_pFirst != NULL && t_pSecond != NULL) {
18         t_pFirst->m_pNext = in_pListNode;
19         in_pListNode = t_pFirst;
20         t_pFirst = t_pSecond;
21         t_pSecond = t_pSecond->m_pNext;
22     }
23     t_pFirst->m_pNext = in_pListNode;
24     return t_pFirst;
25 }
26
27 int main() {
28     ListNode* t_iListNode = new ListNode();
29     ListNode* t_iListNodeHead = t_iListNode;
30     for(int i = 1; i < 10; i ++) {
31         t_iListNode->m_iData = i;
32         ListNode* t_iListNodeNext = new ListNode();
33         t_iListNode->m_pNext = t_iListNodeNext;
34         t_iListNode = t_iListNodeNext;
35     }
36     t_iListNode->m_iData = 10;
37     ListNode* t_iTempListNode =t_iListNodeHead;
38     cout << "链表翻转前:" ;
39     while(t_iTempListNode != NULL) {
40         cout << t_iTempListNode->m_iData << " ";
41         t_iTempListNode = t_iTempListNode->m_pNext;
42     }
43     cout << endl;
44
45     t_iTempListNode = Reverse(t_iListNodeHead);
46
47     cout << "链表翻转后:" ;
48     while(t_iTempListNode != NULL) {
49         cout << t_iTempListNode->m_iData << " ";
50         t_iTempListNode = t_iTempListNode->m_pNext;
51     }
52     cout << endl;
53       system("pause");
54       return 0;
55
56
57 }
时间: 2024-10-12 04:31:29

给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来的相关文章

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

#include <iostream> #include <string.h> #include <stdlib.h> #include <stack> using namespace std; struct Node { int data; struct Node* next; }; struct Node* create_list(int len) { if (len <= 0) return NULL; struct Node* head; st

给定链表的头指针和一个结点指针,在O(1)时间删除该结点

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 具体思路:把头结点的数据直接copy到要删除的结点处,然后头指针向后移动一个结点,再free掉原来的头指针指向的结点,这样等于把要删除的结点删除了.当链表只有一个结点或者要删除的结点是头结点或尾结点时,这种方法也是成立的,所以不需要做特殊的处理.假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n).那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,

给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1。

1. 给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1. sample: 输入:"abcdefcba" 输出:3 解法:先遍历字符串,用一个map记录每个字符出现的次数,再次遍历字符串,找到第一个只出现一次的字符,复杂度为O(n). #include <iostream> #include <string> #include <cstring> #include <map> using namespace std; int

单链表的插入伪算法和用C语言创建单链表,并遍历

非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p->pNext = q; // q保存了那一块结点的地址.q是一个指针变量,存放那个结点的地址.q->pNext = r; 第二种表示方法:q->pNext = p->pNext; // q的指针域指向p后面一个结点p->pNext = q; // p的指针域指向q 删除非循环单链表结点

单链表的头指针、头结点与首元结点

继续我们昨天所说的单链表.单链表也是一种线性表,所以总得有个头有个尾.链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了.之后的每一个结点,其实就是上一个的后继指针指向的位置.雅加达娱乐城 这里有个地方要注意,就是对头指针概念的理解,这个很重要.“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针.画一个图吧. 这个图看起来很清晰了.比如说头结点,我们就可以这么描述了: 头结点是为了操作的统一与方便而设立的,放在第一个元

单链表 之c代码

我们知道数据结构就是数据及其相互关系,包括逻辑结构和物理结构.单链表的逻辑结构是一种一对一的线性关系,物理结构是利用节点把数据结合起来,在计算机中体现这种一对一的数据关系.单链表节点包括包含数据本身信息的数据域和体现数据一对一关系的指针域.因为单链表只有一个指向后一节点的单一指针域next 所以单链表只能从前往后遍历,而不能从后向前遍历,这就意味着一旦单链表的某一节点丢失 ,后面所有的数据信息都会丢失,并且单链表有头指针唯一确定,要想查找单链表的 某一数据只能从头开始遍历,最坏时间复杂度为O(n

从无头单链表中删除节点

1.从无头单链表中删除节点 一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点).将该节点删除. A-->B-->C-->D       =====>     A-->C-->D 问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C; 这里有个技巧,将C当做B,而B复制成C,则删除C节点即可: 2.给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来. A-->

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

链表之 头节点与尾指针 区别

单链表的必要条件:头节点的head,以及尾指针指向null: 1 头结点 首先,不要被以下三个词组弄混了: 链表头:数据内容为第一个元素的结点. 头指针:指向头结点元素的指针. 头结点:数据内容无效,其指针是头指针. 一句话描述为:头指针是指向头结点的指针,头结点是指向链表头的结点. 对于一个链表来说,头指针是一定存在的,是访问链表的入口,如果没有头指针则无法对其进行访问:链表头对于非空表来说是一定存在的,非空表则不存在. 2 尾指针 另外一种链表的技巧是使用尾指针. 尾指针是相对于头指针而言的