(剑指Offer)面试题16:反转链表
题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
链表的定义如下:
struct ListNode{ int val; ListNode* next; };
思路:
反转链表,需要调整结点的next指针,例如a->b->c,需要调整为a<-b<-c,只要将当前结点的next指针指向前一结点即可,如b->next=a,需要一个变量来保存前一结点;
但调整当前结点的next指针之后,就无法获取原链表的下一结点了,因此需要一个临时变量来保存当前结点的下一结点。
依次遍历整个链表,调整每个结点的next指针,最后返回原链表的最后一个结点指针即可。
代码:
struct ListNode{ int val; ListNode* next; }; ListNode* ReverseList(ListNode* pHead){ ListNode* pReverseHead; ListNode* pCur=pHead; ListNode* pPrev=NULL; ListNode* tmp; while(pCur!=NULL){ tmp=pCur->next; if(tmp==NULL) pReverseHead=pCur; pCur->next=pPrev; pPrev=pCur; pCur=tmp; } return pReverseHead; }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/75e878df47f24fdc9dc3e400ec6058ca?rp=1
AC代码:
class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode* tmp; ListNode* pCur=pHead; ListNode* pPrev=NULL; while(pCur){ tmp=pCur->next; pCur->next=pPrev; pPrev=pCur; pCur=tmp; } return pPrev; } };