C递归实现单向链表的反转
众所周知,链表作为线性表的一种实现方式,有插入删除方便的优点,但不能对节点进行随机访问.同时,要想知道某一节点的前驱节点,必须从头节点开始遍历才能找到,这体现了单链表的方向性.由于单链表方向性的存在,使得链表的反转变得复杂起来.
在这里,采用递归的算法,可以使反转过程看起来更容易理解,代码如下:
在这里,采用递归的算法,可以使反转过程看起来更容易理解,代码如下:
1 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <conio.h> 11 12 13 typedef ElemType; 14 15 16 17 typedef LinkListNode 18 { 19 ElemType ; 20 LinkListNode * next; 21 } *LinkList,*pNode,LinkListNode; 22 23 24 30 LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, (*visit)(ElemType e) ) 31 { 32 (!CurrentNode) 33 ; 34 35 (!CurrentNode->next) 36 { 37 visit(CurrentNode->data); 38 CurrentNode->next=PreNode; 39 CurrentNode; 40 } 41 42 { 43 LinkList FirstNode; 44 45 FirstNode=ReverseLinkList(CurrentNode,CurrentNode->next,visit); 46 47 visit(CurrentNode->data); 48 CurrentNode->next=PreNode; 49 FirstNode; 50 } 51 } 52 53 54 visit(ElemType e) 55 { 56 printf(,e); 57 } 58 59 60 61 PrintLinkList(LinkList PL) 62 { 63 printf(); 64 (PL) 65 { 66 printf(,PL->data); 67 PL=PL->next; 68 } 69 printf(); 70 } 71 72 73 InitializeLinkList(LinkList * Head) 74 { 75 pNode EndNode=*Head; 76 77 pNode TempNode=; 78 i=; 79 getEnter; 80 81 printf(); 82 83 84 () 85 { 86 TempNode=(pNode)malloc((LinkListNode)); 87 TempNode->next=; 88 89 printf(,i); 90 TempNode->data=getchar(); 91 92 93 (TempNode->data== ) 94 { 95 TempNode=; 96 ; 97 } 98 getEnter=getchar(); 99 100 (i==) 101 { 102 *Head=TempNode; 103 EndNode=*Head; 104 } 105 106 EndNode->next=TempNode; 107 EndNode=TempNode; 108 109 i++; 110 } 111 } 112 113 main() 114 { 115 LinkList head=; 116 117 InitializeLinkList(&head); 118 119 PrintLinkList(head); 120 121 head=ReverseLinkList(,head,visit); 122 123 PrintLinkList(head); 124 125 ; 126 }