单链表的逆置是面试常考察的题型
下面总结做这个题型的两种方法:
1.数据结构中栈的思想,先进后出,后进先出(利用数组模拟栈)
代码如下:
void Reverse(List plist)
{
int *arr = (int *)malloc(Gentlength(plist)*sizeof(int));//模拟栈(Getlength函数作用是得到plist中有效数据的长度)
assert(arr!=NULL);
int i=0; //i为数组arr的下标
for(Node *p=plist->next; p!=NULL; p=p->next) //从头到尾遍历plist,将数据全部存入数组arr中
{
arr[i++] = p->data;
}
i--; //让i成为数组中最后一个元素的下标
for(Node *p=plist->next; p!=NULL; p=p->next) //将数组中的数据从后往前,重新赋值到链表中
{
p->data = arr[i--];
}
free(arr);
}
2.利用头插的思想
代码如下:
void Reverse(List plist)
{
Node *p = plist->next; //标记第一个有效数据
Node *q;
plist->next = NULL; //将头节点断开
while(P!=NULL)
{
q = p->next; //q标记p的下一个节点
//将p头插到plist
p->next = plist->next; //改变p中保存的下一个地址
plist->next = p;
p = q;
}
}
综上,可以求出法一的时间复杂度为O(n), 法二的时间复杂度为O(1),在这个角度看法二更好一些。