题目:输入一个链表,反转链表后,输出新链表的表头。
这道题可以画一个链表,反转后的链表其实是将每个箭头的方向翻转过来,再让原来的头节点指向空,即可。怎样实现呢?
我们可以通过两个指针来实现,第一个指针a指向头节点,第二个指针b指向a的下一个节点,然后翻转箭头的实现就是让b指向a,也就是b的下一个节点为a。但是这样只翻转了一个箭头,我们要将所有的箭头都翻转过来,因此,让a往前走一步,b也往前走一步,然后继续翻转即可。那么怎么往前走呢,这里需要定义一个辅助的指针c,让c指向b的下一个节点,然后a走到b的位置,b走到c的位置,就好了。整个过程一直持续到b所指的节点为最后一个节点,所以当b所指的节点不为空时,一直循环。
当跳出循环后,因为原来的头节点翻转后变成了最后一个节点,所以还要让原来的头节点指向空。跳出循环后,a指针指向原链表最后一个节点,也就是新链表的头节点,所以返回a指针所指的节点,就得到了反转后的链表。
c++代码如下:
1 class Solution { 2 public: 3 ListNode* ReverseList(ListNode* pHead) { 4 if(!pHead) return pHead; 5 auto a = pHead, b = a->next; 6 while(b){ 7 auto c = b->next; 8 b->next = a; 9 a = b; 10 b = c; 11 } 12 pHead->next = nullptr; 13 return a; 14 } 15 };