这也是阿里一个面试题,今天刷剑指offer刷到了,好后悔。
1.非递归方法
用三个指针分别记录当前节点和前一个结点pre和后一个结点nex,当前结点首先指向头结点,前后结点都赋为NULL,通过操作使得当前结点的next指向pre,也就是反向,然后将当前结点往后移,继续循环进行反向操作,直到当前结点为NULL,就结束了整个链表的反向,最后返回pre结点,也就是反向后的链表的头(因为此时的当前结点指向NULL)。
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL)
return NULL;
ListNode* r = pHead;
ListNode* pre = NULL, * nex = NULL;
while(r != NULL) {
nex = r->next;
r->next = pre;
pre = r;
r = nex;
}
return pre;
}
2.递归方法
先递归走到尾结点,再从尾结点开始从后往前,让后一个结点指向前一个结点,前一个结点指向NULL,递归回去。
ListNode* ReverseList(ListNode* pHead) {
if(!pHead || !pHead->next)
return pHead;
ListNode* res = ReverseList(pHead->next);
ListNode* nex = pHead->next;
nex->next = pHead;
pHead->next = NULL;
return res;
}