刷leetcode-day25
一、题目:
206.反转链表:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
二、思路:
反转链表结点的值,从第一个结点向后遍历,依次交换前后两个结点的值,把第一个结点的值放到最后;然后再从第一个结点向后依次交换,把第一个结点的值放在倒数第二个结点位置。。。
三、代码(C++):
ListNode* reverseList(ListNode* head) {
if(head==NULL) //判断链表是否为空
return head;
ListNode *p=head;
ListNode *q=head;
ListNode *l=head;
while(q->next!=NULL)
q=q->next; //将q指向尾结点
while(p!=q) //控制每一次需要交换的次数(递减)
{
while(p!=q) //具体的一次交换:把p结点的值交换到q结点处
{
int t=p->val;
p->val=p->next->val;
p->next->val=t;
p=p->next;
}
p=head; //重置p结点
while(l->next!=NULL&&l->next!=q) //寻找当前p结点的上一个结点
l=l->next;
q=l; //把q指向q的上一个结点
l=head; //重置l
}
return head;
}
四、扩展:看不懂T_T