《剑指Offer》面试题:从尾到头打印链表
来源:互联网 发布:软件外包群 编辑:程序博客网 时间:2024/05/16 05:47
题目
输入一个链表的头结点,从尾到头反过来打印出每个结点的值
法一
思路:将链表的指针全部反向,然后输出即可
/*题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值 思路:将链表的指针全部反向,然后输出即可 */#include<stdio.h>#include<string.h>#include <stdlib.h> typedef int ElementType;struct ListNode{ ElementType mValue; ListNode *mpNext;};//输入一个链表的头结点,反向链表 //@param pHead :头结点的指针 ListNode* reverseList(ListNode *pHead){ if(pHead==NULL) { return NULL; } ListNode *cur=pHead; ListNode *pre=NULL; ListNode *next; while(cur->mpNext!=NULL){ next=cur->mpNext;//先把当前结点下一个节点保存起来,作为下一次循环的位置 cur->mpNext=pre; pre=cur; cur=next; } cur->mpNext=pre;//将最后一个节点反向链接 pHead=cur; //将最后一个节点变为头结点 return pHead;}void printList(ListNode* pHead){ if(pHead==NULL){ return ; } ListNode *curNode=pHead; while(curNode->mpNext!=NULL){ printf("%d",curNode->mValue); curNode=curNode->mpNext; } printf("%d",curNode->mValue);//输出最后一个节点的信息 printf("\n");}ListNode* createList() { ElementType value; ListNode* pHead = NULL; ListNode* pCur = NULL; do { scanf("%d",&value); if(value != -1) { ListNode *pNew = (ListNode*)malloc(sizeof( ListNode)); if(pNew == NULL) exit(EXIT_FAILURE); pNew->mValue = value; pNew->mpNext = NULL; if(pHead == NULL) { pHead = pNew; pCur = pHead; } else { pCur->mpNext = pNew; pCur = pCur->mpNext; } } }while(value != -1); return pHead; } int main(void){ //先构造结点数为N的链表 ListNode *pHead; ElemType value; pHead=createList(); //输出正序列表的信息 printList(pHead); pHead=reverseList(pHead); //输入一个链表的头结点,从尾到头反过来打印出每个结点的值 printList(pHead); //反向输出 return 0;}
法二
思路:递归直接输出
实现代码如下:
#include<stdio.h> #include<stdlib.h> typedef int ElemType; struct Node { ElemType mValue; struct Node *mpNext; }; /* 递归从尾到头打印单链表 */ void PrintListReverse(Node* pHead) { if(pHead == NULL) return; if(pHead->mpNext != NULL) PrintListReverse(pHead->mpNext); printf("%d\n",pHead->mValue); } Node* CreateList() { ElemType val; Node* pHead = NULL; Node* pCur = NULL; do { scanf("%d",&val); if(val != -1) { Node* pNew = (Node*)malloc(sizeof(Node)); if(pNew == NULL) exit(EXIT_FAILURE); pNew->mValue = val; pNew->mpNext = NULL; if(pHead == NULL) { pHead = pNew; pCur = pHead; } else { pCur->mpNext = pNew; pCur = pCur->mpNext; } } }while(val != -1); return pHead; } void DestroyList(Node* pHead) { if(pHead == NULL) return; Node* p = NULL; while(pHead != NULL) { p = pHead->mpNext; free(pHead); pHead = p; } } int main() { Node* pHead = CreateList(); PrintListReverse(pHead); DestroyList(pHead); return 0; }
上面两种方法都可以实现从尾都头打印链表。
最后提供向链表尾部添加新的结点的代码如下
//向链表尾部添加新的结点ListNode* addNodeToTailInList(ListNode *pHead,int value){ //根据value构造一个新的结点 //ListNode *pNew=new ListNode(); ListNode *pNew; pNew=(ListNode *)malloc(sizeof(struct ListNode)); pNew->mValue=value; pNew->mpNext=NULL; //如果pHead 为空,则新结点就为头结点 if(pHead==NULL){ pHead=pNew; } ListNode *temp=pHead; while(temp->mpNext!=NULL){ temp=temp->mpNext; } temp->mpNext=pNew; return pHead;}
1 0
- 《剑指Offer》面试题:从尾到头打印链表
- 剑指offer面试题 从尾到头打印链表
- 面试题6:从尾到头打印链表(offer)
- 剑指offer面试题5——链表之从尾到头打印链表
- 剑指offer-->面试题5 从尾到头打印链表
- [剑指offer][面试题5]从尾到头打印链表
- 【剑指offer】面试题5:从尾到头打印链表
- 剑指offer 面试题5 从尾到头打印链表(栈实现)
- 剑指offer 面试题5 从尾到头打印链表(递归实现)
- 【剑指offer】面试题5:从尾到头打印链表 java
- 剑指Offer: 面试题5 从尾到头打印链表
- 《剑指Offer》面试题5:从尾到头打印链表
- 剑指offer--面试题5:从尾到头打印链表--Java实现
- 【剑指Offer学习】【面试题5 : 从尾到头打印链表】
- 《剑指Offer》学习笔记--面试题5:从尾到头打印链表
- 【剑指offer】 面试题5: 从尾到头打印链表
- 剑指offer《面试题5:从尾到头打印链表》
- 【剑指Offer面试题】 九度OJ1511:从尾到头打印链表
- static用途
- Problem 10:Regular Expression Matching
- 虚拟局域网技术详解
- Swift - 基本运算符
- 自己实现简单RPC功能
- 《剑指Offer》面试题:从尾到头打印链表
- SPFA
- CGI
- Toast(提示)
- css优化十大办法
- C语言查看程序运行的时间
- 面向程序员的免费杂志
- Ubuntu虚拟机IP及DNS的查询方法
- Java中的值传递和引用传递