反转链表

反转链表

题目描述

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

才发现牛客网链表没表头, 哭死,

递归太漂亮了(来自牛客), 忍不住提到版本一(按照先后顺序应该是版本二),

版一: 首先递归到最后一个元素并返回, 返回方式目前见到有点新意以后每次都返回这个指针(递归没有用到它, 却还能返回), 到最后一个元素时返回, 返回后的pHead指向倒数第二个元素, 把使倒数第二个元素的下一个元素指向当前元素, 令当前元素的next为null, 此后一次出栈, 同时最后一个出栈元素的next值为null, 太漂亮了

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if ((NULL == pHead) || (NULL == pHead->next)) {
            return pHead;
        }
        
        ListNode* ret = ReverseList(pHead->next);
        
        pHead->next->next = pHead;
        pHead->next = NULL;
        
        return ret;
    }
};

版本一: 三个指针来回交换, 由于要交换顺序, 别忘记第一个元素的next设置为null

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if ((NULL == pHead) || (NULL == pHead->next)) {
            return pHead;
        }
        
        ListNode *index1 = pHead->next;
        ListNode *index2 = pHead->next;
        ListNode *index3 = pHead;
        
        while (NULL != index1) {
            index1 = index2->next;
            index2->next = index3;
            if (index3 == pHead) {
                 index3->next = NULL;   
            }
            index3 = index2;
            index2 = index1;
        }
        
        return index3;
    }
};
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
posted @ 2019-02-26 22:08  张飘扬  阅读(107)  评论(0编辑  收藏  举报