反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一:三指针法
这种办法实际上就是用next指针记住当前位置的后一个节点,然后让当前节点与之前节点反转链接,然后让当前位置变为next,具体代码如下
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* cur = head;
struct ListNode* prev = NULL;
struct ListNode* next;
while(cur)
{
next = cur -> next;
cur -> next = prev;
prev = cur;
cur = next;
}
return prev;
}
方法二:递归(详解)
我们使用递归的原理是每次调用函数让他的头指针向后走,直到走到尾节点,我们将尾节点作为头,然后递归回去相当于我们倒着访问了这个单链表,具体的过程我们画成了一幅图,图如下奉上。(鼠标点击图片可以放大哦)
代码如下。
struct ListNode* reverseList(struct ListNode* head)
{
if(head == NULL || head -> next == NULL) return head;
struct ListNode* h = reverseList(head -> next);
head -> next -> next = head;
head -> next = NULL;
return h;
}