• C++ 单向链表反转


    单向链表反转,一道常见的面试题,动手实现下。

     1 #include "stdafx.h"
     2 #include <stdlib.h>
     3 struct Node{
     4     int data;
     5     Node* next;
     6 };
     7 
     8 void print1(Node *head)  
     9 {  
    10     Node *p;  
    11     p=head;  
    12     if(head!= NULL)  
    13     do  
    14     {  
    15     printf("%d 
    ", p->data);  
    16     p=p->next;  
    17     }while(p!=NULL);  
    18 }
    19 
    20 Node* ReverseList(Node* head)
    21 {
    22     if(head==NULL)
    23         return NULL;
    24 
    25     Node* cur=head;
    26     Node* pre=NULL;
    27     Node* nx=NULL;
    28     while(cur->next!=NULL)
    29     {
    30         nx=cur->next;
    31         cur->next=pre;
    32         pre=cur;
    33         cur=nx;
    34     }
    35     cur->next=pre;
    36     return cur;
    37 }
    38 Node* init( int num) // insert from back  
    39 {  
    40     if(0 >= num)  
    41         return NULL;  
    42     Node* cur, pre;  
    43     Node* head = NULL;  
    44     int i = 0; cur = head;  
    45     Node* new1 = (Node*)malloc(sizeof(Node));  
    46     new1->data = 1;  
    47     head = cur = new1;  
    48     for(i = 1; i < num; i++)  
    49     {  
    50         Node* new1=(Node*)malloc(sizeof(Node));  
    51         new1->data = i + 1;  
    52         cur->next = new1;  
    53         cur = new1;  
    54     }  
    55      cur->next = NULL;     
    56     return head;      
    57 }  
    58 int _tmain(int argc, _TCHAR* argv[])
    59 {
    60     Node* list =NULL;
    61     list=init(10);
    62     print1(list);
    63     Node* newlist=ReverseList(list);
    64     print1(newlist);
    65     getchar();
    66     return 0;
    67 }

    原理就是把cur节点的next节点保存,把next指向pre节点,把之前保存的next节点赋给cur,不断循环直到next节点为NULL。注意下,退出循环后要把cur节点next指向pre节点。把cur节点返回,大功告成。

    如果不用返回值,而是把head=cur;这样可以吗?

    可尝试下,那么你会看到打印结果为1。这是因为函数按指针传递,传递的是地址,虽然在reverse函数中head已是一个反转的链表,但在main函数中list仍然指向原来head的地址。换句话说,在反转链表整个过程中地址是不变的,list还是指向data 1的节点。

  • 相关阅读:
    Qt学习之路,part1
    1.获取状态栏的高度
    如何在Android Studio中上传代码到Gitee上
    关于类图
    外观模式
    关于类的实例
    SharedPreference中关于editor.apply()和editor.commit()
    活动的4种启动模式
    unittest中case批量管理
    unittest使用
  • 原文地址:https://www.cnblogs.com/jammy/p/3532262.html
Copyright © 2020-2023  润新知