反转一个单链表,分别以迭代和递归的形式来实现

迭代法:

 1 // 反转单链表.cpp : 定义控制台应用程序的入口点。
 2 
 3 #include "stdafx.h"
 4 #include <stdlib.h>
 5 
 6 typedef struct node
 7 {
 8     int data;
 9     struct node *next;
10 }linknode,*linklist;
11 
12 linknode *reverse(linknode *head)//带有头结点的单链表迭代反转,非递归方法
13                                  //思路:将当前结点的next指向前驱;当前结点指向next
14 {
15     if(head==NULL)
16         return 0;
17     linknode *pre,*cur,*ne;//pre 前驱结点指针;cru当前结点指针;ne后继指针
18     pre=head;
19     cur=head->next;
20     while(cur!=NULL)
21     {
22         ne=cur->next;
23         cur->next=pre;
24         pre=cur;
25         cur=ne;
26     }
27     linknode *q;
28     q=head->next;
29     q->next=NULL;
30     head->next=pre;
31     return head;
32 }
33 
34 void printLinkList_H(linklist L) //打印
35 {
36     linklist p;
37     p=L->next;
38     while(p)
39     {
40         printf("%4d", p->data);
41         p = p->next;
42     }
43     printf("\n");
44 }
45 
46 void main()
47 {
48     int i;
49     linklist L = (linklist)malloc(sizeof(linknode));
50     L->next = NULL; //头结点
51     for(i = 1;i<=5;i++)//新建一个带头结点的单链表
52     {
53         linklist p = (linklist)malloc(sizeof(linknode));
54         p->data = i;
55         p->next = L->next;
56         L->next = p;
57     }
58     printLinkList_H(L);
59     reverse(L);
60     printLinkList_H(L);
61 }

 

递归法:

 

 1 // 反转单链表.cpp  递归法
 2 
 3 #include "stdafx.h"
 4 #include <stdlib.h>
 5 
 6 typedef struct node
 7 {
 8     int data;
 9     struct node *next;
10 }linknode,*linklist;
11 
12 
13 linknode *RecReverseList(linknode *head)
14 {
15    if (head==NULL)  
16        return 0;
17    linknode *curr , *reverse_head , *temp;
18    if(head->next==NULL)
19        return head;
20    else 
21    {
22         curr=head;
23         temp=head->next;
24         reverse_head=RecReverseList(temp);
25    }
26     temp->next=curr;
27     curr->next=NULL;
28     return reverse_head;
29 }
30 
31 void printLinkList_H(linklist L) //打印
32 {
33     linklist p;
34     p=L->next;
35     while(p)
36     {
37         printf("%4d", p->data);
38         p = p->next;
39     }
40     printf("\n");
41 }
42 
43 
44 void main()
45 {
46     int i;
47     linklist L = (linklist)malloc(sizeof(linknode));
48     L->next = NULL; //头结点
49     for(i = 1;i<=5;i++)//新建一个带头结点的单链表
50     {
51         linklist p = (linklist)malloc(sizeof(linknode));
52         p->data = i;
53         p->next = L->next;
54         L->next = p;
55     }
56     printLinkList_H(L);
57     linklist q;
58     q=RecReverseList(L->next);
59     while(q)
60     {
61         printf("%4d", q->data);
62         q = q->next;
63     }
64 }

 

转载于:https://www.cnblogs.com/xingele0917/archive/2012/10/04/2711641.html

反转一个单链表是指将链表中的元素顺序颠倒过来,通常不改变节点间的连接关系。在C语言中,可以使用迭代或者递归的方式实现。这里是一个简单的迭代方法: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建新节点 Node* createNode(int val) { Node* newNode = (Node*)malloc(sizeof(Node)); if (!newNode) { printf("Memory allocation failed.\n"); return NULL; } newNode->data = val; newNode->next = NULL; return newNode; } // 反转函数 Node* reverseList(Node* head) { Node* prev = NULL; // 指向前一个节点 Node* current = head; // 当前处理的节点 Node* nextTemp; // 临时存储下一个节点 while (current != NULL) { // 获取当前节点的下一个节点 nextTemp = current->next; // 将当前节点的next指向前一个节点 current->next = prev; // 更新prevcurrent prev = current; current = nextTemp; } // 返回新的头节点(原链表的尾部) return prev; } // 打印链表 void printList(Node* head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } int main() { Node* head = createNode(1); // 创建初始链表,例如 1 -> 2 -> 3 -> NULL head->next = createNode(2); head->next->next = createNode(3); printf("Original list: "); printList(head); head = reverseList(head); printf("Reversed list: "); printList(head); return 0; } ``` 这个程序首先创建一个单链表,然后调用`reverseList`函数将其反转,并最后打印出反转后的链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值