题目原链接: 206. 反转链表
解法一:
思路:从头开始,用三个指针,用while循环,每次将连续三个结点中的中间节点next指向前一节点,然后将三个指针后移,为什么需要三个指针呢,这是因为在单链表中,除了头结点外的任何节点都需要其前驱节点来获取。如果某个结点的next指向了别处,那你将无法获取他原本指向的next。
代码实现:
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
{
return head;
}
struct ListNode *p=head;
struct ListNode *q=NULL;
while(p!=NULL)
{
struct ListNode *l=p->next;
p->next=q;
q=p;
p=l;
}
return q;
}
时间复杂度:显然为 O(n)。
解法二:
思路:
应用递归思想,从头结点开始,对于每个结点来说,假设后面的一系列结点都反转完成,那么只需将其next指向自己即可,对倒数第二个结点来说,后面仅有的一个结点可以看作本来就反转完成的,那么此时就是终止递归的时候。
最后一定要注意最后将首个结点的next指向空。
代码实现:
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* l = reverseList(head->next);
(head->next)->next = head;
head->next = NULL;
return l;
}
时间复杂度:显然为O(n)。