数据结构学习笔记1-链表反转(递归与非递归)

来源:互联网 发布:淘宝买家数据购买 编辑:程序博客网 时间:2024/06/16 21:56

最近在学习数据结构,做下笔记:
思路很多,如下:

不使用递归:

//============================================================================// Name        : 链表反转.cpp// Author      : Gaotong// Version     :// Copyright   : www.acmerblog.com// Description : Hello World in C++, Ansi-style//============================================================================#include<stdio.h>#include<stdlib.h>/* 链表节点 */struct node{    int data;    struct node* next;};/* 反转单链表. 分别用3个指针,指向前一个,当前,下一个 */static void reverse(struct node** head_ref){    struct node* prev   = NULL;    struct node* current = *head_ref;    struct node* next;    while (current != NULL)    {        next  = current->next;        current->next = prev;        prev = current;        current = next;    }    *head_ref = prev;}/* 添加数据。 头部插入 */void push(struct node** head_ref, int new_data){    struct node* new_node =            (struct node*) malloc(sizeof(struct node));    new_node->data  = new_data;    new_node->next = (*head_ref);    (*head_ref)    = new_node;}/* 打印链表 */void printList(struct node *head){    struct node *temp = head;    while(temp != NULL)    {        printf("%d  ", temp->data);        temp = temp->next;    }}int main(){    struct node* head = NULL;     push(&head, 20);     push(&head, 4);     push(&head, 15);     push(&head, 85);     push(&head, 60);     push(&head, 100);     printList(head);     reverse(&head);     printf("\n Reversed Linked list \n");     printList(head);}

使用递归:

/* 使用递归的方法 */static struct node * reverseRecall(struct node* head){    //最后一个节点会返回 作为头部    if(NULL == head || head->next == NULL) return head;    //head->next 表示剩下的部分    struct node * newHead = reverseRecall(head->next);    head->next->next = head; //颠倒指针    head->next = NULL;//原来的头节点 next 应该为空    return newHead;}

源代码来源于
链表反转-数据结构
参考博文:
看图理解单链表的反转
单链表反转/逆序的两种方法

0 0
原创粉丝点击