您的位置:首页 > 其它

链表的那些事儿<一>

2015-09-24 14:12 225 查看
现在想起来大一上黄老师的课,很多人学习到链表这一块时,就有些吃力。

我的看法是,如果有一天你遇到了无法理解的东西,那么就尝试接受他,直到有一天,你会发现这个东西是如此自然,以至于不理解都不可能。

让我们先做几个关于链表的小操作锻炼一下~

翻转链表

难度:easy

要求:空间复杂度为O(1)

我们不可能新开一个链表,所以必须在原链表上进行更改。

假定有链表

例如:A->B->C->D

实现

listNode* reserve(listNode* head){
if (!head||!head->next)return NULL;
listNode* pre=head;
listNode* cp=head->next;

pre->next = NULL;
while (cp->next){
listNode* temp;
temp = cp->next;
cp->next = pre;
pre = cp;
cp = temp;
}
cp->next = pre;
return cp;
}


这个算法难么,不难,但是首先要搞清楚指针的关系。

看代码没有什么用处,重要的是要有一个思路

()中的两个结点分别表示pre和cp

开始时:

A->B->C->D

(NULL<-A B)->C->D

NULL<-A<-(B C)->D

NULL<-A<-B<-(C D)

至此 while循环结束 括号不再右移

cp->next=pre;返回cp(D->next=C;返回D;)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: