经典面试题目--逆转单向链表
来源:互联网 发布:邢台羊毛衫知乎 编辑:程序博客网 时间:2024/04/24 12:02
最近觉得很有必要练习一下基本的数据结构题目。单向链表的反转如果只是描述思路的话,其实很好说明白。但是一旦开始实际的操作,发现会有一些小问题。所以,笔者实打实的写了一下代码,这里只展示一下几个基本函数。
链表的构建 --
typedef struct LinkNode {unsigned int value;struct LinkNode *pNext;}LinkNode, *pLinkNode;pLinkNode CreateLinkNode(unsigned int val) {pLinkNode pHead = (pLinkNode)malloc(sizeof(pLinkNode));printf("\n\n~~~~~~~~~~~~ CreateLinkNode ~~~~~~~~~~~~ val = %u\n",val);pHead->value = val;pHead->pNext = NULL;return pHead;}
遍历以及计数 --
// calculate the number of elementsint TraverseLink(pLinkNode pNode) {printf("\n\n~~~~~~~~~~~ TraverseLink ~~~~~~~~~~\n");if(pNode==NULL) {printf("pNode == NULL so print NOTHING\n");return 0;}int count = 0;while(pNode!=NULL) {printf("@@@@@ %u @@@@@\n",pNode->value);pNode = pNode->pNext;count++;}return count;}
最关键的函数,元素逆转 --
pLinkNode ReverseLink(pLinkNode pHead) {printf("\n\n~~~~~~~~~~~ ReverseLink ~~~~~~~~~~\n");if(pHead==NULL) return NULL;pLinkNode p_cur = pHead;pLinkNode p_previous = NULL;pLinkNode p_next = NULL;while(p_cur!=NULL) {p_next = p_cur->pNext;p_cur->pNext = p_previous;p_previous = p_cur;p_cur = p_next;}return p_previous;}
这里,有必要提及一下销毁链表的函数 --
void DestroyLink(LinkNode **pNode) {printf("\n\n~~~~~~~~~~~ DestroyLink ~~~~~~~~~~\n");if((*pNode)==NULL)return;int count = 0;LinkNode *p_cur = *pNode;LinkNode **p_previous = pNode;while(p_cur!=NULL) {printf("\n@@@@@@@@@@@@@@@@ %d checking %u !!! @@@@@@@@@@@@\n",count,p_cur->value);// set up the previous pointer*p_previous = p_cur;// let the current pointer moves to the next elementp_cur = p_cur->pNext;// clear up the previous pointerfree(*p_previous);*p_previous = NULL;count++;}*p_previous = NULL;*pNode = NULL;return;}
因为本人有点儿强迫症,喜欢free某个空间后,把指针置为NULL,因此这里传递的参数需要是**标记的指向指针的指针。
刚开始写的时候没有注意,只是用了指针,结果根本无法把链表的每个元素指针置为空值,后来意识到了错误在哪里,具体可以看笔者的另一篇博文《c语言函数free某个空间》。
(码字不易,转载请注明出处)
阅读全文