赞
踩
好!!先来看题:
这里我们用两种方法来做这道题
方法一:迭代法
方法二:头插法
我认为两种方法的基本实现原理差不多,但是还是都说一下为好
1.迭代法:
首先,我要强调一个东西,对于链表来说,在对其执行命令时,第一步就是考虑链表的情况,比如说:链表为空,链表为1个结点,链表为1个以上个结点。在不同的情况下,这3种情况可能合并为两种 或者 一种情况;
就题目分析:
(目前不会操作画图软件,哈哈)
X,Y,Z即n1,n2,n3
知道上面这些后,然后知道迭代就行了
struct ListNode* reverseList(struct ListNode* head){ if(head==NULL||head->next==NULL)//链表为空 或者 一个结点 { return head; } else//一个以上个结点 { struct ListNode*n1=NULL,*n2=head,*n3=head->next; while(n2!=NULL) { //反转 n2->next=n1;//最重要的一步,其他各步都是围绕“完成这一步并且不影响下一次操作”而进行; //迭代 n1=n2; n2=n3; if(n2!=NULL) n3=n3->next; } return n1; } }
代码中while(n2!=NULL)的解释:
2.头插法:
首先,我要强调一个东西,对于链表来说,在对其执行命令时,第一步就是考虑链表的情况,比如说:链表为空,链表为1个结点,链表为1个以上个结点。在不同的情况下,这3种情况可能合并为两种 或者 一种情况;(哈哈,复制的上面的,知道这个的重要性了吧)
知道这个然后仿照前面迭代法中的分析总结出问题中的情况
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* newhead=NULL;
struct ListNode* cur=head;
while(cur!=NULL)
{
struct ListNode* next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
}
思路:
(刚开始写,极显不成熟)
完!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。