经典面试题目--逆转单向链表

博主分享了在准备面试时对数据结构基础题——单向链表逆转的实践心得。通过实际编写代码,探讨了操作链表时可能遇到的问题,特别是如何正确处理链表元素指针,以避免内存泄漏。此外,还提及了相关错误的解决方法,参考了之前关于C语言中释放内存的博文。
摘要由CSDN通过智能技术生成

最近觉得很有必要练习一下基本的数据结构题目。单向链表的反转如果只是描述思路的话,其实很好说明白。但是一旦开始实际的操作,发现会有一些小问题。所以,笔者实打实的写了一下代码,这里只展示一下几个基本函数。


链表的构建 --

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 elements
int 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 element
		p_cur = p_cur->pNext;
		
		// clear up the previous pointer
		free(*p_previous);
		*p_previous = NULL;

		count++;

	}
	*p_previous = NULL;
	*pNode = NULL;
	return;
}

因为本人有点儿强迫症,喜欢free某个空间后,把指针置为NULL,因此这里传递的参数需要是**标记的指向指针的指针。

刚开始写的时候没有注意,只是用了指针,结果根本无法把链表的每个元素指针置为空值,后来意识到了错误在哪里,具体可以看笔者的另一篇博文《c语言函数free某个空间》。

(码字不易,转载请注明出处)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值