剑指offer之面试题16:反转链表
题目:输入一个链表,反转链表后,输出链表的所有元素。
思路一:利用栈的后进先出
创新互联主要从事成都网站设计、成都网站建设、外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务松滋,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
代码:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* pHead) { //利用栈的后进先出的特点,最后进的最先出 stacks1; ListNode *p=pHead; //将链表中的每个元素的值进行压栈 while(p!=NULL) { s1.push(p->val); p=p->next; } //出栈,并且将栈顶元素放入链表中 p=pHead; while(!s1.empty()) { p->val=s1.top(); s1.pop(); p=p->next; } return pHead; } };
思路二:进行摘结点,然后头插
代码:
class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(pHead==NULL) { return NULL; } ListNode *newHead=NULL; ListNode *cur=pHead; ListNode *tmp=NULL; while(cur!=NULL) { tmp=cur; //关键点:一定要让cur先往后走,再进行插入操作 //不然会让原链表找不到后面的结点,结果就会变成只有一个结点 cur=cur->next; tmp->next=newHead; newHead=tmp; } return newHead; } };
思路三:利用递归,找到最后一个结点作为函数的返回值,然后在改变该链表的每一个当前pHead的位置
代码:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* pHead) { //终止条件 if(pHead==NULL||pHead->next==NULL) { return pHead; } //newHead得到对应的返回值,尾节点 ListNode *newHead=ReverseList(pHead->next); //然后将当先栈帧中的pHead的next进行更改 //比如说1->2->3->4->NULL //newHead->4 //pHead->3 //4->3->null //此时指向3的还有1->2->3->null pHead->next->next=pHead; pHead->next=NULL; return newHead; } };
网站题目:剑指offer之面试题16:反转链表
分享URL:http://myzitong.com/article/ieccce.html