您的位置:首页 >热讯 > 正文

206.反转链表

题目:

206. 反转链表

难度简单3050

给你单链表的头节点 head,请你反转链表,并返回反转后的链表。


(资料图)

示例 1:

输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]输出:[2,1]

示例 3:

输入:head = []输出:[]

提示:

链表中节点的数目范围是 [0, 5000]

-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

第一种对法:

/**

* Definition for singly-linked list.

* struct ListNode {

*     int val;

*     struct ListNode *next;

* };

*/

struct ListNode* reverse(struct ListNode* cur,struct ListNode* pre){

if(cur==NULL)return pre;

struct ListNode *tmp = cur->next;

cur->next = pre;

return reverse(tmp,cur);

}

struct ListNode* reverseList(struct ListNode* head){

return reverse(head,NULL);

}

递归写法,最后记得return

第二种对法:

/**

* Definition for singly-linked list.

* struct ListNode {

*     int val;

*     struct ListNode *next;

* };

*/

struct ListNode* reverseList(struct ListNode* head){

struct ListNode *tmp;

struct ListNode *cur;

struct ListNode *pre;

cur = head,pre= NULL;

while(cur){

tmp = cur->next;

cur->next = pre;

pre = cur;

cur = tmp;

}

return pre;

}

迭代写法,先把cur的next保存下来,避免断链

第三种对法:

struct ListNode* reverseList(struct ListNode* head){

struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));

p->next = NULL;

struct ListNode *cur = head;

while(head){

cur = head->next;

head->next = p->next;

p->next = head;

head = cur;

}

return p->next;

}

头插法;

关键词

热门资讯