单向链表反转

题目:已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel)

解答:
我们假设单向链表的节点如下:

template <typename T>
class list_node
{
public:
list_node * next;
T data;
};

这个题目算是考察数据结构的最基础的题目了,有两种方法可以解此题:

方法一:

    void reverse(node*& head)
    {
        if ( (head == 0) || (head->next == 0) ) return;// 边界检测
        node* pNext = 0;
        node* pPrev = head;// 保存链表头节点
        node* pCur = head->next;// 获取当前节点
        while (pCur != 0)
        {
            pNext = pCur->next;// 将下一个节点保存下来
            pCur->next = pPrev;// 将当前节点的下一节点置为前节点
            pPrev = pCur;// 将当前节点保存为前一节点
            pCur = pNext;// 将当前节点置为下一节点
        }
    }

这是一般的方法,总之就是用了几个临时变量,然后遍历整个链表,将当前节点的下一节点置为前节点。

方法二:

    node* reverse( node* pNode, node*& head)
    {
        if ( (pNode == 0) || (pNode->next == 0) ) // 递归跳出条件
        {
            head = pNode; // 将链表切断,否则会形成回环
            return pNode;
        }

        node* temp = reserve(pNode->next, head);// 递归
        temp->next = pNode;// 将下一节点置为当前节点,既前置节点
        return pNode;// 返回当前节点
    }

这个方法是采用了递归算法,也就是在反转当前节点之前先反转其后继节点,说白了其实就是利用函数的调用堆栈构建了一个临时链表罢了,挺废的一个算法,权当作是写着好玩,没有什么实在的意义。
采用此算法需要注意的是,头结点必须要传入的是引用,因为在递归跳出的时候要切断链表,否则链表将会形成一个回环。

时间: 2024-10-26 19:31:34

单向链表反转的相关文章

c语言-C语言中单向的链表反转?

问题描述 C语言中单向的链表反转? 这段代码实在看不懂啊,求解 Linklist *reverse(Linklist *head) //链表逆置 { Linklist *p,*t; p=head->next; t=p->next; p->next=NULL; while(t!=NULL) { p=t->next; t->next=head->next; head->next=t; t=p; } return head; } 其中之一:while中第二句head-&

c语言-C语言中单向的链表反转

问题描述 C语言中单向的链表反转 node* reverse1(node * head) { node*p,*q,*r; p = head; q = head->next; head->next = NULL; while(q){ r = q->next; q->next = p; p = q; q = r; } head=p; /* while(p) { printf("%d ",p->num); p=p->next; }*/ printf(&qu

单向链表的方法优化

前几天写了一篇关于单向链表的实现方法,单向链表的具体实现在里面都有说明,见博客:http://cq520.iteye.com/blog/1853186 不过细心的朋友也许发现了,上次写的几个方法其实是存在漏洞的,插入方法与删除方法都不能操作第一个元素,而实际上操作第一个元素的方法与操作其他元素的方法是一样的,只是代码描叙上有些差异,原因在于:首结点不存在前结点对它的引用 优化之后的代码如下: Java代码 /** * 向链表中插入新元素的方法 * @param index 插入的位置 * @pa

单向链表的翻转

单向链表翻转,之前把这个问题想的太简单了,以为只要把数据域翻转过来就可以了,结果是筐了大瓢,下面举一个简单的例子说明: 假设有n个人站成一排,现在要把这n个人的站的顺序颠倒过来,那么就不能只把这n个人的身高颠倒过来,而是要把每一个人的位置颠倒过来,第一个人站到最后,第二个人站倒数第二,以此类推. 为了检验程序的正确性,这一次我们打印时不能再打印结点数据,而要打印结点.Java程序运行时,JVM为程序开辟了内存空间,每一个结点在栈中都有一个保存的位置,要注意的是,每次程序运行时某一个结点在内存中保

如何使用递归和非递归方式反转单向链表

以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下   问题: 给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node {  char value;  Node next; } 因 为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新

如何使用递归和非递归方式反转单向链表_C 语言

问题:给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node { char value; Node next;} 因为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新 next 的值前,我们需要保存 next 的值,否则我们无法继续.所以,我们需要两个指针分别指向前一个节点

c语言-反转单向链表,C语言,运行出错

问题描述 反转单向链表,C语言,运行出错 #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct LNode{ int node; struct LNode *next; } LNode,*LinkList; LinkList Head_Node() { LinkList he

单向链表翻转

好久没写C代码了,看到微博上有人出了这个题.手痒写一下.指针这个东西,用得好妙笔生花,用得不好就会各种踩坑. 至于链表,主要是要考虑好它的结构.可以画图来帮助思考.然后就是注意一些变量的变化. 01 #include <string> 02 #include <cstring> 03 #include <iostream> 04 #include <cstdio> 05 using namespace std; 06 #define LL long long

一步一步写算法(之循环单向链表)

原文:一步一步写算法(之循环单向链表) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     前面的博客中,我们曾经有一篇专门讲到单向链表的内容.那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面.有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势.     那么在实现过程中,循环单向链表有什么不同?     1)打印链