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