链表反转(C++版)

题目:

实现一个链表反转的算法,注意算法的鲁棒性。

注:

链表结点的定义如下:

struct ListNode {
int val;
struct ListNode *
next;
ListNode(int x) :val(x), next(NULL) {}
};
  

直接上代码:

ListNode* ReverseList(ListNode* pHead) 
    {
        // 如果链表为空或者只有一个结点 直接返回即可。
		if(pHead == NULL || pHead->next == NULL)
		{
            return pHead;
        }
        
        // 定义相邻3个辅助结点指针
        // p 指向待处理的结点
        // q 指向待处理的结点的下一个结点
        // r 指向当前已处理完毕的结点
        
        ListNode *p = pHead, *q = pHead->next, *r = pHead;
        p->next = NULL;
        p = q;
        
        while(p)
		{
            q = p->next;		// 保存待处理结点的下一个结点
            p->next = r;		// 链接到上一个结点
            r = p;				// 当前结点已处理完毕 更新
            p = q;				// 更新待处理的结点
        }
        
        return r;
    }

你可能感兴趣的:(算法面试题系列,链表反转,链表逆序)