迭代
将链表看成两部分,一部分是已经反转的部分,一部分是未反转的部分。为此定义两个变量:
temp : 保存未反转部分的头结点
pre : 保存已经反转部分的头结点
ListNode* reverseList(ListNode* head) {
ListNode *pre = NULL;
while(head)
{
ListNode *temp = head->next;
head->next = pre;
pre = head;
head = temp;
}
return pre;
}
递归
递归这里有点复杂,先给出代码。
ListNode* reverseList(ListNode* head) {
//节点为空或者节点为链表末节点
if (!head || !(head -> next)) return head;
ListNode* node = reverseList(head -> next);
head -> next -> next = head;
head -> next = NULL;
return node;
}
这里的head->next->next有点费解。可以看下面的示意图:
比如说运行到第三步,value = 2为头结点,这个节点保存了value = 3这个节点的位置。value = 3这个节点已经被反转了,作为已经反转的部分的尾节点,所以需要将value = 2这个节点加到value这个节点的后边,然后将value = 2的next设置为NULL。
需要明白这一点,才能写出这个反转链表的递归。