剑指offer 16:反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头。
解题思路
单链表原地反转是面试手撕代码环节非常经典的一个问题。针对一般单链表,反转的时候需要操作的是当前节点及与之相邻的其他两个节点。因而需要定义三个临时节点进行指针的指向变化。
一个非常重要的原则:一定要保证代码的鲁棒性。(NULL检验,链表越界检验等等等等,越简单的代码,越考验代码基础功底)
C++代码实现:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *p=NULL,*q=pHead,*tmp=NULL; while(q!=NULL){ tmp=q->next; q->next=p; p=q; q=tmp; } if(pHead!=NULL){ //pHead的指向全程未操作过,所以当反转完成时指向的是最后一个(原第一个)节点,尾节点需要及时置为NULL; pHead->next==NULL; } pHead=p; return pHead; } };