24反转链表
题目描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
代码:
迭代法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *cur=head;
struct ListNode *pre=NULL;
while(cur!=NULL)
{
struct ListNode *tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
总结:
三种方法:
①利用外部空间
申请一个动态扩容的数组,将整个链表中的值存入数组或者容器中,然后反向取出
但是这种方法空间复杂度高,不是一种很好的方法
②双指针迭代
定义两个指针,一个pre,一个cur,以及一个tmp临时变量,用来保存cur->next的值
循环结束的条件是cur指向为空,则pre当前指向的元素就是反转链表要返回的元素
③递归解法:
递归法代码不会写