反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
//========================方法1 迭代========================================
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head==NULL || head->next==NULL)
{
return head;
}
struct ListNode *pcur=head, *pnext=NULL, *newhead=NULL;
while(pcur)
{
pnext=pcur->next;
pcur->next=newhead;
newhead=pcur;
pcur=pnext;
}
return newhead;
}
//=============================方法2 递归=================================================
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//递归
struct ListNode* reverseList(struct ListNode* head) {
if(head == NULL || head->next == NULL)
{
return head;
}
struct ListNode *prev = head, *pcur = head->next;
//递归翻转后续链表,返回翻转后的头节点
pcur = reverseList(pcur);
//翻转前面那个节点,此时prev->next指向翻转后链表的尾节点
prev->next->next=prev;
prev->next = NULL;
//翻转后的头节点为新链表的节点
head = pcur;
return head;
}