剑指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;
    }
};        

猜你喜欢

转载自www.cnblogs.com/fancy-li/p/11616019.html