面试中经常遇到反转单链表,特此总结。
递归版
ListNode* reverseListRecursive(ListNode *head) { if(head == NULL || head->next == NULL) return head; ListNode *newHead = reverseListRecursive(head->next); head->next->next = head; head->next = NULL; return newHead; }
算法执行过程如下
非递归版
将头结点后面的结点通过头插法一个个地插入到链表前面。
ListNode* reverseList(ListNode *head) { if(head == NULL || head->next == NULL) return head; ListNode *newHead = NULL; ListNode *p = head; while (p != NULL) { ListNode *tmp = p; p = p->next; tmp->next = newHead; newHead = tmp; } return newHead; }
算法执行流程如下