链表逆置!!!
算法1:利用栈实现(利用数组模拟栈)
void reverse1(List plist)//O(n),O(n)
{
int len = getlength(plist);
int* arr = (int*)malloc(len* sizeof(int));//模拟栈
assert(arr != NULL);
int i = 0;//arr下标
//从头到尾遍历plist,将数据全部存放到arr中
Node* p;
for (p = plist->next; p != NULL; p = p->next)
{
arr[i] = p->data;
i++;
}
//将数组中的数据从后往前再赋值到链表中
i = len - 1;//成为最后一个元素的下标
Node* p;
for (p = plist->next; p != NULL; p = p->next)
{
p->data = arr[i];
i--;
}
free(arr);
}
算法2:利用头插的思想
void reverse2(List plist)
{
Node* p = plist->next;
Node* q;
plist->next = NULL;
while (p != NULL)
{
q = p->next;
//将p头插到plist中
p->next = plist->next;
plist->next = p;
p = q;
}
}