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.知识点:
头插法,链表递归。