今天晚上闲着没事干,复习复习链表反转,因为自己不是学计算机专业的,所以基础知识比较薄弱,总是会把看过的东西忘掉,所以要多复习,以便不时之需。
单向链表反转其实很简单,有两种常规方式:
1. 循环遍历完成反转。
这种方法比较简单,就是用两个指针,和一个辅助指针,pre, cur , ne , 分别指向head,head->next, head->next->next,节点,也就是前三个节点。
然后把 pre = cur , cur = ne, ne = ne->next, 代码:
struct link {
int data;
link* next;
}
void reverse(linka*& head)void reverse(link *& head)
{
link* pre, cur , ne;
pre = head;
cur = head - >next;
while (cur)
{
ne = cur - >next;
cur -> next = pre;
pre = cur;
cur = ne;
}
head ->next = NULL;
head = pre;
}
简单的很,我就是这么笨,这么简单的代码还要写半天,大神勿喷。。。
下面介绍递归的算法:
link* reverse(link* p, link*& head)
{
if( p == NULL || p - > next == NULL)
{
head = p;
return p;
}
else
{
link* tmp = reverse(p->next, head);
tmp->next = p;
return p;
}
}
递归也是很简单的,看不懂的朋友可以跟我交流。
以后还是要多学习,多复习,形成习惯,不断提高自己的水平。为自己加油!