一、有几种方法
- 数组法,遍历链表每个元素存数组,然后逆序遍历数组输出
- 头插法,遍历链表将遍历到的元素插入链表头,然后重新遍历链表输出
- 栈输出,遍历链表将每个元素存入栈中,然后将栈元素全部出栈输出
- 递归法,遍历链表,非未节点则继续递归
二、实现
数组法实现核心代码:
int array_rever(N *head)
{
int i = 0;
N *p = NULL;
N **parray = NULL;
int len = 0;
len = length(head);
if (len <=0)
return 0;
parray = (N**)malloc(sizeof(N*)*len);
if (!parray)
return -1;
memset(parray, 0, sizeof(N*)*len);
p = head;
while(p)
{
parray[i++] = p;
p = p->next;
}
//输出
for(i=len-1; i >=0; i--)
{
printf("%d ", parray[i]->info);
}
free(parray);
return 0;
}
头插法核心代码:
N *insertToHead(N *head)
{
N *cur = NULL;
N *rear = NULL;
cur = head->next;
head->next = NULL;
while(cur)
{
rear = cur->next;
cur->next = head;
head = cur;
cur = rear;
}
//输出
N *tmp = NULL;
tmp = head;
while(tmp)
{
printf("%d ", tmp->info);
tmp = tmp->next;
}
return head;
}
栈输出核心代码:
linklist *back_linklist(linklist *head)
{
linklist *p;
InitStack(&s1);
p = head->next;//p指向首结点
while (p)
{
Push(&s1, p->data); //链表结点中的数据入栈
p = p->next; //p指针后移
}
p = head->next;//p再指向首结点
while (!StackEmpty(&s1)) //当栈s不空时
{
p->data = Pop(&s1); //数据出栈,并存入p所指结点的数据域
p = p->next; //p指针后移
}
return head;
}
递归实现核心代码:
linklist *back_linklist(linklist *head)
{
if (!head)
return NULL;
back_linklist(head->next);
printf("%d ", head->data);
return head;
}
总结:
递归法耗缓存
栈方法与数组方法区别不大
效率最高的是头插法,通过改变指针来调整顺序