- 5
- 0
- 约3.34千字
- 约 2页
- 2023-12-05 发布于中国
- 举报
C递归实现单向链表的反转
C递归实现单向链表的反转
众所周知,链表作为线性表的⼀种实现⽅式,有插⼊删除⽅便的优点,但不能对节点进⾏随机访问.同时,要想知道某⼀节点的前驱节点,必须从头节点开始遍历才能找到,这体现了单链表
的⽅向性.由于单链表⽅向性的存在,使得链表的反转变得复杂起来.
在这⾥,采⽤递归的算法,可以使反转过程看起来更容易理解,代码如下:
1 /*
2 Code by : EricYou
3 Date: 2006.1.14
5
6 */
7
8 #include stdio.h
9 #include stdlib.h
10 #include conio.h
11
12 /*链表节点存储的数据*/
13 typedef char ElemType;
14
15
16 /*链表节点结构*/
17 typedef struct LinkListNode
18 {
19 ElemType data ;
20 struct LinkListNode * next;
21 } *LinkList,*pNode,LinkListNode;
22
23
24 /*递归实现反转不带头节点的单向链表
25
26 pNode:PerNode 前⼀节点指针
27 pNode:CurrentNode 后⼀节点指针
28 visit ⾃定义节点访问函数
29 */
30 LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, void(*visit)(ElemType e) )
31 {
32 if(!CurrentNode) /*如果当前节点指针为空,则返回NULL,此种情况只有在*/
33 return NULL; /*链表头指针为空时才可能执⾏到*/
34
35 if(!CurrentNode-next) /*如果下⼀节点指针为空,则将当前节点next指针指向上⼀节点,并*/
36 { /*返回当前节点指针,次种情况只有在当前节点为尾节点时才能执⾏到*/
37 visit(CurrentNode-data);
38 CurrentNode-next=PreNode;
39 return CurrentNode;
40 }
41 else /* 其他节点的情况,先调⽤递归函数反转后续节点,再反转当前节点*/
42 { /*并将递归函数返回来的尾节点指针向上层函数返回*/
43 LinkList FirstNode;
44
45 FirstNode=ReverseLinkList(CurrentNode,CurrentNode-next,visit);
46
47 visit(CurrentNode-data);
48 CurrentNode-next=PreNode;
49 return FirstNode; /*返回的是尾节点的指针,即反转后新链表的头指针*/
50 }
51 }
52
53 /* ⾃定义链表节点访问函数*/
54 void visit(ElemType e)
55 {
56 printf(process node %c\n,e);
57 }
5
59
60 /*打印链表*/
61 void PrintLinkList(LinkList PL)
62 {
63 printf(\n\n);
64 while(PL)
65 {
66 printf(%c ,PL-data);
67 PL=PL-next;
68 }
69 printf(\n\n);
70 }
71
72 /*⽤键盘输⼊初始化⼀个链
原创力文档

文档评论(0)