剑指offer-面试题16.反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点

链表结点定义如下:

1 struct ListNode
2 {
3     int    m_nKey;
4     ListNode* m_pNext;
5 }

 

其实反转链表主要是链表指针的操作,一定要很清楚才行。其实在面试题5,从尾到头打印链表的第一种方式已经实现了这种方式:

 

这里在梳理下反转链表的过程:

比如链表:1->2->3->4->5->6

1.定义三个指针p1,p2,p3

2.p1指向1,p2指向2,p3指向3

3.p2->next=p1;然后p1=p2,p3=p2

4.这时1<-2  3->4->5->6 p1指向2,p2指向3,p3指向4

5.重复第4步(p2->next=p1,p1=p2,p3=p2,此时1<-2<-3 4->5->6 依次类推)

6.结束条件为p2==NULL,最后将头结点的next指向NULL即可

 

实现如下:

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct ListNode
 5 {
 6     int data;
 7     struct ListNode *next;
 8 };
 9 
10 struct ListNode* CreateList()
11 {
12     struct ListNode* Head,*p;
13     Head=(struct ListNode*)malloc(sizeof(ListNode));
14     Head->data=0;
15     Head->next=NULL;
16     p=Head;
17 
18     cout<<"Create List....(0-exit!)"<<endl;
19     while(true)
20     {
21         int Data;
22         cin>>Data;
23         if(Data!=0)
24         {
25             struct ListNode* NewNode;
26             NewNode=(struct ListNode*)malloc(sizeof(ListNode));
27             NewNode->data=Data;
28             NewNode->next=NULL;
29             p->next=NewNode;
30             p=p->next;
31         }
32         else
33         {
34             break;
35         }
36     }
37 
38     return Head->next;
39 }
40 
41 void PrintList(struct ListNode* Head)
42 {
43     cout<<"The List is: ";
44 
45     struct ListNode *p;
46     p=Head;
47     while(p!=NULL)
48     {
49         cout<<p->data<<" ";
50         p=p->next;
51     }
52     cout<<endl;
53 }
54 
55 struct ListNode* ReversePrint(struct ListNode* Head)
56 {
57     struct ListNode *p1,*p2,*p3;
58 
59     p1=Head;
60     p2=p1->next;
61 
62     while(p2!=NULL)
63     {
64         p3=p2->next;
65         p2->next=p1;
66         p1=p2;
67         p2=p3;
68     }
69 
70     Head->next=NULL;
71     return p1;
72 }
73 
74 int main()
75 {
76     ListNode *Head,*NewHead;
77     Head=CreateList();
78     PrintList(Head);
79     NewHead=ReversePrint(Head);
80 
81     cout<<endl<<"The Reverse List is:"<<endl;
82     PrintList(NewHead);
83     return 0;
84 }
复制代码

 

运行截图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值