题目描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
反转链表分为两种链表
1.有头节点
方法
1.1
头插法: 遍历整个链表,依次对所有节点进行头插,直到遍历完整个链表
1.2
迭代法:定义三个指针,遍历链表,并在访问各节点时修改 next 引用
2.没有头节点
而此题正属于没有头节点的题
方法
1.1
迭代法:定义三个指针,一个pre,一个p(指向当前节点),一个next(指向下一个节点),遍历链表,并依次修改next(这个只要把图画出来,就会很容易写出迭代的过程)
1.2
递归
要用递归解决问题的话,只要写出递归公式,问题就迎刃而解,我们首先先来分析,
1->2->3
我们要反转1->2这两个节点,前提是2->3这个问题已经解决,所以我们可以把整个(反转这个链表)问题分为
f(1) =f(2)+反转1->2
代码实现
迭代法:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode * p =head;
struct ListNode *pre =NULL;
struct ListNode *next =NULL;
while(p!=NULL){
next=p->next;
p->next=pre;
pre=p;
p=next;
}
return pre;
}
递归法:
struct ListNode * reverseList (struct ListNode * head){
if(head == NULL||head->next==NULL ){
return head;
}
struct ListNode * p =reverseList(head->next);
head->next->next =head;
head->next=NULL;
return p;
}