zoukankan      html  css  js  c++  java
  • 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的节点。

  • 相关阅读:
    一款非常好用的范围滑动插件
    设置滚动条样式
    Qml 定义 constant
    qml 中 使用 shader
    Qt ImageProvider 的使用
    qt 汉化 国际化
    qt rcc 使用
    CentOS7/RHEL7 pacemaker+corosync高可用集群搭建
    Ubunt平台Qt出现:-1: error: cannot find -lgl
    排序-堆排序
  • 原文地址:https://www.cnblogs.com/jammy/p/3532262.html
Copyright © 2011-2022 走看看