zoukankan      html  css  js  c++  java
  • 剑指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 }

    运行截图:

  • 相关阅读:
    深度学习中的特征(feature)指的是什么?
    随机权值平均的原理解释
    第04组 Beta冲刺(4/4)
    2019 SDN上机第7次作业
    第04组 Beta冲刺(3/4)
    第04组 Beta冲刺(2/4)
    第04组 Beta冲刺(1/4)
    2019 SDN上机第6次作业
    2019 SDN上机第5次作业
    SDN课程阅读作业(2)
  • 原文地址:https://www.cnblogs.com/vpoet/p/4671861.html
Copyright © 2011-2022 走看看