您的位置:首页 > 编程语言 > C语言/C++

c语言用尾递归实现单向链表的逆向排列

2017-02-09 10:32 609 查看
c++的stl很好用,c语言的简单链表最近几年几乎不用了。最近一次笔试,遇到了这题,就十分捉急。当时想到似乎得用递归。现在算是完成了。

以下以简单的单向链表(链表头结点跟普通结点一致)为例。

#include <stdlib.h>
typedef struct Node {
int i;
struct Node *pNext;
} Node;
Node *createList(const int *datas, unsigned numOfData);
Node *reverseList(Node *pList);
int main() {
int datas[4] = { 1, 3, 0, -78 };
Node *pList = createList(datas, sizeof(datas) / sizeof(int));
Node *pList2 = reverseList(pList);
return 0;
}

Node *createList(const int *datas, unsigned numOfData) {
Node *pTmp = NULL;
Node *pLast = NULL;
Node *pHead = NULL;
const size_t sizeOfNode = sizeof(Node);
pHead = (Node*)malloc(sizeOfNode);
pHead->i = datas[0];
pLast = pHead;
for (unsigned i = 1; i < numOfData; i++) {
pTmp = (Node*)malloc(sizeOfNode);
pTmp->i = datas[i];
pLast->pNext = pTmp;
pLast = pTmp;
}
pLast->pNext = NULL;
return pHead;
}

Node *reverseNode(Node *pCur, Node *pPre) {
Node *pNext = pCur->pNext;
pCur->pNext = pPre;
if (pNext == NULL) {
return pCur;
}
return reverseNode(pNext, pCur);
}

Node *reverseList(Node *pList) {
return reverseNode(pList, NULL);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息