(1)使用双指针
(1)一开始定义两个指针cur和prev,cur指向第一个节点,prev指向空。
(2)然后将cur->next指向prev ,实现第一次反转,但是如果直接改cur->next,那么下一个节点就找不到了,为了方便起见,再定义一个指针next,保存cur的下一个节点。
(3)不断地使cur->next=prev,实现反转,然后向后迭代,如何迭代,只需要将prev=cur; cur=next;就可以实现,直到将所有数据反转。
(4)可见,当cur为空时就结束。
代码为:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *prev=NULL;
struct ListNode *cur=head;
if(head==NULL)
{
return head;
}
while(cur)
{ struct ListNode * next=cur->next; //如果把next定义到外面,就要判断next为空的情况
cur->next=prev;
prev=cur;
cur=next;
}
return prev;
}
(2)采用头插法
(1)定义两个指针,一个为cur,指向第一个节点 。一个为newnode,是新节点的头指针。
(2)和上面一样,为了迭代方便,再定义一个指针next保存cur的下一个的节点的地址。
(3)然后把每个节点都拿下来头插,如图。
(4) 每一次头插完之后,要将 newnode指向此时新的头,(因为newnode代表的是反转后新链表的头,如第一次将节点1头插完,此时节点1就是新链表的头,newnode就指向节点1)然后进行迭代,cur变成了next,next又指向下一个位置。过程如图:
(5)最后,在cur为空时就结束了,反转后的链表的头就为newnode。
代码为:
ListNode* reverseList(ListNode* head) {
ListNode *cur=head;
ListNode *newhead=NULL;
while(cur)
{
ListNode *next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
}