题目:反转一个单链表
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
题解
迭代法
需要三个指针实现,前一个节点,当前节点和后一个结点。反转时把当前节点指向前一个节点,再把当前节点和前一个节点都后移。因为反转过后节点会断开所以需要变量来保存当前节点的后一个节点。整体迭代的条件是当前节点不为空。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *pre = NULL;
ListNode *cur = head;
while(cur!=NULL)
{
ListNode *temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
递归法
从后往前处理,找到最后的一个数并用新的指针存储其位置作为反转后的新表头。递归返回的条件是指针当前为空即空链表或者是当前的指针的next为空即递归到最前面的一个数。
把5指向4,head->next->next = head;
反转指针,其中head是当前指针把它当前节点的后一个节点再指向当前节点,再把head的下一个节点置位空。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next ==NULL)
{
return head;
}
ListNode *newhead = reverseList(head->next);
head->next->next = head;
head->next == NULL;
return newhead;
}
};