题目:
Reverse a singly linked list.
题意:
将输入的单向链表翻转。这道题我在腾讯秋招面试的时候遇到过。最直观的思路是使用栈,将链表从头到尾扫描一遍,然后逐一弹出,重新连接。但这个做法的缺点是占用额外O(n)的空间。更为优化的办法是想,是否可以直接进行链表的翻转,不依赖额外的空间。
代码:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode *p, *q, *r;
q = head;
while(q != NULL)
{
if(q == head)
{
r = q;
q = q->next;
r->next = NULL;
}
else
{
p = q;
q = q->next;
p->next = r;
r = p;
}
}
return r;
}
AC啦~用链表的操作也是可以的!哈哈哈!