题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
struct
ListNode
{
int
m_nKey;
ListNode* m_pNext;
};
ListNode*
ReverseIteratively(ListNode* pHead)
{
ListNode* pReversedHead =
NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while
(pNode !=
NULL)
{
// get
the next node, and save it at
pNext
ListNode* pNext =
pNode->m_pNext;
// if
the next node is null, the currect is the end of
original
//
list, and it's the head of the reversed
list
if
(pNext ==
NULL)
pReversedHead = pNode;
//
reverse the linkage between
nodes
pNode->m_pNext = pPrev;
//
move forward on the the list
pPrev = pNode;
pNode = pNext;
}
return
pReversedHead;
}
解法二:
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
Node* ReverseList(Node* head)
{
if (!head || !head->next)
{
return head;
}
Node* p1 = head;
Node* p2 = p1->next;
head->next = NULL;
while (p2)
{
p1 = p2;
p2 = p2->next;
p1->next = head;
head = p1;
}
return head;
}
解法三:
Node* RecReverseList(Node* head) //递归方法
{
if (!head || !head->next)
{
return head;
}
Node *newhead = RecReverseList(head->next);
head->next->next = head;
head->next = NULL;
return newhead;
}
递归的解释说明:
上面的递归算法看不懂可以参考下面(其实与上面的递归算法是一样,多了注释而已):
// p 为指向非空单链表中第一个结点的指针,本算法逆转链表并返回逆转后的头指针。基本思路是:如果链表中只有一个结点,则空操作,否则先逆转a2开始的链表,然后将 a1联接到逆转后的链表的表尾(即a2)之后。
LinkList reverse(LinkList p)
{
if(p->next == NULL) return p; // 链表中只有一个结点,逆转后的头指针不变
else
{
q = p->next; // q为链表(a2,…an)的头指针
h = reverse(q); // 逆转链表(a2,…an),并返回逆转后的头指针
q->next = p; // 将a1联接在a2之后
p->next = NULL;
return h; // (a2,…,an)逆转表的头指针即为(a1,a2,…,an)
}
}
下面是单链表的逆序输出:
递归实现:
void
printSList(slist
*
pList)
{
assert(pList);
if
(pList
==
NULL)
return
;
if
(pList
->
next
==
NULL)
printf(
"
%s
"
,
*
pList);
else
{
printSList(pList
->
next);
printf(
"
%s
"
,
*
pList);
}
}
栈的实现:
void ReservePrint(List L)
{
assert( NULL != L );
int count = 0;
int temp;
while (NULL != L->Next)
{
++count;
temp = L->data;
stack_s.push( temp);
L = L->Next;
}
while(--count>=0)
{
temp=stack_s.top()
stack_s.pop();
printf(" %d ", temp);
}
数组实现:
用数组保存链表数据,然后从高维向低维输出
关于栈的使用:
#include<iostream> #include<stack> using namespace std; stack<char> sts; void main() { char i,temp; for(i=65;i<70;i++) { sts.push(i);//进栈 cout<<i<<" "; } cout<<endl; for(i=65;i<70;i++) { temp=sts.top();//取栈顶元素 sts.pop();//出栈 cout<<temp<<" "; } cout<<endl; }
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 831我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 961第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 566第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1058一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1409解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 719/****************************** ... -
堆排序
2012-08-16 14:24 882堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 830#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 746一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1703用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1146int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 798顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1024话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 886KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9776两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 986算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 974假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 766很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1290题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7271、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
程序员面试题精选 100 题(01)-把二元查找树转变成排序的 双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向。 程序员面试题精选 100 题...
在程序员面试过程中,面试官常常会提出各种各样的问题来测试候选人的技能和思维能力。这些题目涵盖了数据结构、算法、编程语言特性等多个方面。下面我们将详细探讨两个常见的面试题及其解题思路。 第一个题目是“从...
【程序员面试题精选】——用两个栈实现队列 在面试中,经常会出现这样一道题:如何使用两个栈来模拟一个队列的行为。这道题目旨在考察候选者对数据结构的理解,尤其是对栈(LIFO,后进先出)和队列(FIFO,先进先出...
以上是对Java程序员面试中常见的一些题目和知识点的详细解析,涵盖排序算法、二分查找、分块查找、二叉树遍历、二叉树性质等多个核心概念,这些都是Java程序员必备的技能和知识。了解并熟练掌握这些内容对于提升面试...
本文将深入探讨标题和描述中提到的两个关键概念:有无头结点的单链表的逆序以及插入排序,这些都是在面试中,尤其是像微软这样的顶级科技公司面试时常见的问题。 首先,我们来理解单链表的概念。单链表是一种线性...
Java 程序员笔试题面试题.pdf 以下是对给定文件的知识点分析: 一、编程语言方面 1. Java 中的字符串操作:在选择题 1 中,考察了 Java 中字符串的操作,特别是字符串的连接和修改。在 Java 中,字符串是 ...
根据提供的文件信息,我们可以整理出一系列与2010年程序员笔试面试相关的知识点。下面将对这些知识点进行详细的解析。 ### 1. 编程语言的重要性 - **知识点**: 编程语言的选择对于软件开发至关重要。 - **题目**: 1...
2 将一个 1M 10M 的文件 逆序存储到另一个文件 就是前一个文件的最后一个 字符存到新文件的第一个字符 以此类推 3 main主函数执行完毕后 是否可能会再执行一段代码 (朗讯的一道笔试题) 答案:可以 可以用 ...
这份“php程序员面试题(c卷 附答案).pdf”文档显然是为准备PHP开发者面试的人提供的一份宝贵资源。下面,我们将深入探讨其中涉及的一些关键知识点。 1. **传值与传引用的区别**: - **传值**:当一个变量的值被...
【知识点详解】 1. **UML (统一建模语言)**:UML是一种标准化的建模语言,用于软件设计和系统...这些知识点涵盖了计算机科学和软件开发的多个领域,对于准备华为程序员面试的求职者来说,理解并掌握这些内容至关重要。
本题目的核心是“链表逆序”,这是一个常见的编程面试和笔试问题,主要考察程序员对链表操作的理解和实现能力。接下来,我们将详细讨论链表逆序的概念、方法以及如何使用C++进行实现。 链表逆序,顾名思义,就是将...
这是一份关于程序员面试的智力题及答案的PDF文件,包含11道智力题,涵盖了算法、数据结构、逻辑思维等方面的知识点。 问题1:双人游戏策略 考虑一个双人游戏,游戏在一个圆桌上进行,每个游戏者都有足够多的硬币。...
### Python程序员面试(算法完整) #### 面试策略与技巧 **1. 如何巧妙地回答面试官的问题** - 在面试过程中,面试官可能会问到一些基础性或者概念性的问题,比如Python的基本语法、面向对象编程的概念等。为了...
程序员面试刷题的书哪个好 自己对常见的前端题的总结,参考了很多大牛的想法,如有漏写链接的请提醒,原文有错请指出,谢谢!!! 基础部分 数组去重 // 利用对象属性不能重复的原理 Array.prototype.distinct = ...
【数据结构】是计算机科学中的基础概念,是用于组织...这些面试题涉及到单链表的基本操作,理解和熟练掌握这些知识点对于提升编程技能和应对面试至关重要。在解决这类问题时,应注重逻辑清晰、边界条件处理和代码效率。