反转链表17

原创 2016年05月30日 20:27:57

题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点的定义如下:

struct ListNode{
  int m_value;  //节点存储的值
  ListNode *m_next;  //节点指针
  void show(); //打印所有节点值
};

解题思路:需要三个指针,当前遍历的节点,它的前一个节点以及它的后一个节点,防止链表断开。

测试用例:

int main(){
    //创建一个多结点链表
    ListNode *L2 = new ListNode;
    L2 = NULL;  
    addToTail(&L2, 1); 
    addToTail(&L2, 2); //末尾加入2
    addToTail(&L2, 3); //末尾加入3
    addToTail(&L2, 4); //末尾加入4
    addToTail(&L2, 5); //末尾加入5
    addToTail(&L2, 6); //末尾加入6
    //显示L2
    std::cout << "L2: ";   
    L2->show(); //Output:1,2,3,4,5,6
    std::cout << std::endl; 

    //反转链表,多个节点
    std::cout << ReverseList(L2)->m_value << std::endl;  //OutPut: 6

    //单个节点
    ListNode *L1 = new ListNode;
    L1 = NULL;
    addToTail(&L1, 9);
    std::cout << ReverseList(L1)->m_value;

    return 0;
}

反转链表函数实现:

//本题函数实现
ListNode* ReverseList(ListNode *pHead){
    if(!pHead){
        std::cout << "List is NULL\n";
        return NULL;
    }
    //待返回的头节点
    ListNode *reversedHead = new ListNode;
    reversedHead = NULL;

    //当前遍历到的节点
    ListNode *pNode = pHead;
    //当前遍历节点的前一节点
    ListNode *pPrev = new ListNode;
    pPrev = NULL;

    while(pNode != NULL){
        //当前遍历节点的后一个节点
        ListNode* pNext = pNode->m_next;
        if(pNext == NULL)
            reversedHead = pNode;
        //当前结点的下一节点指向当前结点的前一节点
        pNode->m_next = pPrev; //这是反转的过程
        //前一节点指向遍历的当前结点
        pPrev = pNode;
        //当前遍历的节点指向下一节点
        pNode = pNext;
    }
    return reversedHead;
}

//以下为其他函数实现
void ListNode::show(){
    ListNode *temp = this;
    if(temp == NULL)
        std::cout << "\nlist is NULL\n";
    while(temp != NULL){
       std::cout << temp->m_value << " ";
       temp = temp->m_next;
    }
}

//在一个链表的末尾添加一个节点
void addToTail(ListNode **head, int value){//由于会改动链表指针,所以必须把head参数设为指向指针的指针。否则出了这个函数作用域,改动便无效。
    //1.首先创建要插入的节点
    ListNode *pNew = new ListNode;
    pNew->m_value = value; //指定值
    pNew->m_next = NULL; //!!!切记指定下一节点为NULL

    //2.如果传入的节点为空,可直接创键头节点
    if(*head == NULL)
        *head = pNew;
    else{//否则3.
        //定义一个临时节点
        ListNode *temp = *head;
        while(temp->m_next != NULL) //循环指向末尾节点, !!!切记必须指向下一节点
            temp = temp->m_next;
        //对末尾的下一个节点赋值,取代之(末尾)
        temp->m_next = pNew;
    }
}
版权声明:本文为博主原创文章,转载请注明出处。

反转单链表 (三种方法整理)

题目:反转单链表 输入一个链表,反转链表后,输出链表的所有元素。 据找工作的师兄说,反转单链表基本各个公司面试都会有,整理出一些写的比较好的code,供我等小白们学习。简洁,清晰,...
  • hyqsong
  • hyqsong
  • 2015年10月26日 21:15
  • 18969

Java单链表反转 详细过程

Java单链表反转 Java实现单链表翻转 使用递归法实现单链表反转,使用遍历反转法:递归反转法是从后往前逆序反转指针域的指向,而遍历反转法是从前往后反转各个结点的指针域的指向。     【尊重原创,...
  • guyuealian
  • guyuealian
  • 2016年04月11日 10:36
  • 29051

反转单向链表

反转单向链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。而单向链表就是在每一个结点中除了保存的数据之外只有一个指向下一个节点的指针。双向...
  • iosrookie
  • iosrookie
  • 2015年05月23日 07:46
  • 972

剑指offer_面试题16_反转链表(两种方法)

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 在解决问题前,先想好测试用例: 1、功能测试:输入的链表含有多个结点,链表中只有一个结点 2、特殊输入测试:头结点...
  • jwentao01
  • jwentao01
  • 2015年08月10日 11:00
  • 1961

链表翻转的图文讲解(递归与迭代两种实现)

链表的翻转是程序员面试中出现频度最高的问题之一,常见的解决方法分为递归和迭代两种。最近在复习的时候,发现网上的资料都只告诉了怎么做,但是根本没有好好介绍两种方法的实现过程与原理。所以我觉得有必要好好的...
  • FX677588
  • FX677588
  • 2017年05月17日 15:25
  • 1026

递归和非递归实现链表反转

链表反转是面试笔试常考题目,直接贴代码。 反转函数如下://思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面 void ReverseList(ListNode * ...
  • yunzhongguwu005
  • yunzhongguwu005
  • 2013年08月26日 16:43
  • 12644

数据结构——反转单链表

最近看了《剑指offer》这本书,遇到了一个问题:反转链表 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。 链表结点定义如下:struct ListNode { ...
  • u013271921
  • u013271921
  • 2015年06月05日 22:17
  • 3026

剑指Offer面试题16(Java版):反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月01日 16:45
  • 1381

数据结构之Java单链表反转

本文为数据结构基础,研究得不是很深。用Java实现单链表的反转,虽然本文研究得不是很深,但是因为是数据结构,所以必须是在对Java内存比较清楚的情况下才能真正的搞懂吃透,如果对Java内存不够清楚,那...
  • qq_24692041
  • qq_24692041
  • 2017年03月16日 15:44
  • 1228

单链表操作之反转单链表

***单链表操作之反转单链表*** //反转单链表,只能遍历一遍链表 // 定义的结点结构体和头指针结构体: typedef int DataType; t...
  • bitboss
  • bitboss
  • 2016年06月08日 09:46
  • 1666
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反转链表17
举报原因:
原因补充:

(最多只允许输入30个字)