[leetcode]206. 反转链表

1.题目:
反转一个单链表。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

2.代码:

非递归:

//非递归,头插法:
struct ListNode* reverseList(struct ListNode* l) {
	struct ListNode* head=(struct ListNode* )malloc(sizeof(struct ListNode));
	   head->next=NULL;
	   struct ListNode* p=l,* temp;
	   while(p){
	       temp=p->next;
	       p->next=head->next;
	       head->next=p;       
	       p=temp;
	   }
	   return head->next;t;
}

递归:

//递归法: h为反转后的链表头,一直都是不变的。
//链表递归回来就是反向遍历,把自己的next节点的next指向自己就实现了反转
struct ListNode* reverseList(struct ListNode* l) {
    if(l==NULL||l->next==NULL) 					//一般情况有l->next==NULL找到最后一个节点就够了,但还有[]情况。
        return l;
    struct ListNode* h=reverseList(l->next);
    l->next->next=l;
    l->next=NULL;								//不改的话反转之后尾节点的next指向它上一个,不是NULL;
    return h;
}

3.知识点:

头插法,链表递归。

猜你喜欢

转载自blog.csdn.net/MJ_Lee/article/details/88238844