`
蒙面考拉
  • 浏览: 160556 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

程序员面试题精选100题(13)-单链表的逆序以及逆序输出

 
阅读更多

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:

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;
}
分享到:
评论

相关推荐

    程序员面试题精选100题

    程序员面试题精选 100 题(01)-把二元查找树转变成排序的 双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向。 程序员面试题精选 100 题...

    程序员面试题精选 题很多

    在程序员面试过程中,面试官常常会提出各种各样的问题来测试候选人的技能和思维能力。这些题目涵盖了数据结构、算法、编程语言特性等多个方面。下面我们将详细探讨两个常见的面试题及其解题思路。 第一个题目是“从...

    程序员面试题精选.doc

    【程序员面试题精选】——用两个栈实现队列 在面试中,经常会出现这样一道题:如何使用两个栈来模拟一个队列的行为。这道题目旨在考察候选者对数据结构的理解,尤其是对栈(LIFO,后进先出)和队列(FIFO,先进先出...

    Java程序员面试分类真题带解析.docx

    以上是对Java程序员面试中常见的一些题目和知识点的详细解析,涵盖排序算法、二分查找、分块查找、二叉树遍历、二叉树性质等多个核心概念,这些都是Java程序员必备的技能和知识。了解并熟练掌握这些内容对于提升面试...

    算法分析_有无头结点的单链表的逆序和插入排序问题集源码微软面试题总结

    本文将深入探讨标题和描述中提到的两个关键概念:有无头结点的单链表的逆序以及插入排序,这些都是在面试中,尤其是像微软这样的顶级科技公司面试时常见的问题。 首先,我们来理解单链表的概念。单链表是一种线性...

    中科软java程序员笔试题面试题.pdf,这是一份不错的文件

    Java 程序员笔试题面试题.pdf 以下是对给定文件的知识点分析: 一、编程语言方面 1. Java 中的字符串操作:在选择题 1 中,考察了 Java 中字符串的操作,特别是字符串的连接和修改。在 Java 中,字符串是 ...

    2010 程序员 笔试面试题

    根据提供的文件信息,我们可以整理出一系列与2010年程序员笔试面试相关的知识点。下面将对这些知识点进行详细的解析。 ### 1. 编程语言的重要性 - **知识点**: 编程语言的选择对于软件开发至关重要。 - **题目**: 1...

    程序员面试经典题

    2 将一个 1M 10M 的文件 逆序存储到另一个文件 就是前一个文件的最后一个 字符存到新文件的第一个字符 以此类推 3 main主函数执行完毕后 是否可能会再执行一段代码 (朗讯的一道笔试题) 答案:可以 可以用 ...

    php程序员面试题(c卷 附答案).pdf,这是一份不错的文件

    这份“php程序员面试题(c卷 附答案).pdf”文档显然是为准备PHP开发者面试的人提供的一份宝贵资源。下面,我们将深入探讨其中涉及的一些关键知识点。 1. **传值与传引用的区别**: - **传值**:当一个变量的值被...

    华为程序员面试试题.pdf,这是一份不错的文件

    【知识点详解】 1. **UML (统一建模语言)**:UML是一种标准化的建模语言,用于软件设计和系统...这些知识点涵盖了计算机科学和软件开发的多个领域,对于准备华为程序员面试的求职者来说,理解并掌握这些内容至关重要。

    笔试题之链表逆序A->B->C to C->B>A

    本题目的核心是“链表逆序”,这是一个常见的编程面试和笔试问题,主要考察程序员对链表操作的理解和实现能力。接下来,我们将详细讨论链表逆序的概念、方法以及如何使用C++进行实现。 链表逆序,顾名思义,就是将...

    程序员有趣的面试智力题及答案.pdf,这是一份不错的文件

    这是一份关于程序员面试的智力题及答案的PDF文件,包含11道智力题,涵盖了算法、数据结构、逻辑思维等方面的知识点。 问题1:双人游戏策略 考虑一个双人游戏,游戏在一个圆桌上进行,每个游戏者都有足够多的硬币。...

    python程序员面试(算法完整)

    ### Python程序员面试(算法完整) #### 面试策略与技巧 **1. 如何巧妙地回答面试官的问题** - 在面试过程中,面试官可能会问到一些基础性或者概念性的问题,比如Python的基本语法、面向对象编程的概念等。为了...

    程序员面试刷题的书哪个好-web_question:前端面试题总结

    程序员面试刷题的书哪个好 自己对常见的前端题的总结,参考了很多大牛的想法,如有漏写链接的请提醒,原文有错请指出,谢谢!!! 基础部分 数组去重 // 利用对象属性不能重复的原理 Array.prototype.distinct = ...

    算法大全-面试题-数据结构

    【数据结构】是计算机科学中的基础概念,是用于组织...这些面试题涉及到单链表的基本操作,理解和熟练掌握这些知识点对于提升编程技能和应对面试至关重要。在解决这类问题时,应注重逻辑清晰、边界条件处理和代码效率。

Global site tag (gtag.js) - Google Analytics