反转链表

题目:输入一个链表,反转链表后,输出新链表的表头。

这道题可以画一个链表,反转后的链表其实是将每个箭头的方向翻转过来,再让原来的头节点指向空,即可。怎样实现呢?

我们可以通过两个指针来实现,第一个指针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 };

 

posted @ 2019-10-11 20:32  wtzhang  阅读(159)  评论(0编辑  收藏  举报