其实关于链表的题目动手在纸上画一下,就会有思路,如果只是单纯钉着电脑空想代码该长什么样,很难有结果。
链表的反转就是把,把后驱结点变成前驱结点,变一下Next指针域的指向。但如果头结点和后面的结点丢失联系的话,就会找不到其它结点,或者头结点找不到了。所以我们多开几个指针来保存一下结点的位置。
经过尝试,要逆转指针需要记录三个结点的位置,至少要三个指针来保存,头结点是一个现成的指针,所以只要开两个新指针,也就是常用的双指针法。
对于单链表不熟悉的同学可以看我的上一篇文章
http://t.csdn.cn/Gg0NIhttp://t.csdn.cn/Gg0NI
过程大概是这样的
然后是代码
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*p1=NULL,*p2=NULL;
while(head){
p1=head->next;
head->next=p2;
p2=head;
head=p1;
}
return p2;
}
leetcode的206题就是反转链表