单链表的逆转

链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求。和线性逆转不一样,单向链表的节点需要一个一个进行处理。为了显示两者之间的区别,我们分别对线性内存和链表进行逆转:

    (1)普通连续内存数据的反转分析

STATUS normal_revert(int array[], int length)
{
	int* pTemp ;
	int index = length - 1;
	if(NULL == array || 0 == length)
		return FALSE;

	pTemp = (int*)malloc(sizeof(int) * length);
	assert(NULL != pData);
	memset(pTemp, 0, sizeof(int) * length);//将数组pTemp的元素值都初始化为0

	while(index >= 0)
		{
			pData[length - 1 - index] = array[index]; //翻转过程
			index --;
		}

	memmove(array, pData, length * sizeof(int));//将pTemp数组的元素内容拷贝回原array
	free(pData);
	return TRUE;
}

我们看到连续内存反转函数主要做了下面几个工作:

    1)分配和原来数据一样大的内存

    2)从原来数据末尾开始拷贝 

    3)利用pData获取的数据对原来的数据进行拷贝覆盖,释放内存


    (2)链表数据的反转

//链表逆转

Node* LinkListReserve(LinkNode head)

{

       LinkNode p = NULL; //记录逆转节点的前一个节点;

       LinkNode r = head; //记录当前节点;

       LinkNode q = NULL; //记录逆转节点的下一个节点;

 

       while (r != NULL)

       {

              q = r->_next;  //保存下一个节点

              r->_next = p;  //逆转

 

              p = r;         //未下一次遍历移动指针
              r = q;		

       }

 

       return p;

}


转载自:http://blog.csdn.net/feixiaoxing/article/details/6853660



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值