【17】剑指offer——反转链表

题目描述

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

解题思路:

思路一:利用一个栈,先遍历整个链表,把链表存入栈中,然后生成一个新的链表,每一个元素都从栈中弹出。

代码如下:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if (pHead == NULL) return NULL;
        
        stack list;
        
        while (pHead != NULL){
            list.push(pHead);
            pHead = pHead -> next;
        }
        
        
        ListNode* newList = list.top();
        ListNode* ans;
        ans = newList;
        list.pop();
        
        while (!list.empty()){
            newList -> next = list.top();
            newList = newList -> next;
            list.pop();
        }
        
        newList -> next = NULL;
        return ans;
    }
};

思路二:我是看讨论知道的,不用一个新的数据结构保存链表中的所有元素,只要更改链表中的元素next即可。

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if (pHead == NULL) return NULL;
        ListNode* tmp1 = pHead -> next;
        pHead -> next = NULL;
        ListNode* tmp2;
        
        while (tmp1 != NULL){
            tmp2 = tmp1 -> next;
            tmp1 -> next = pHead;
            pHead = tmp1;
            tmp1 = tmp2;
        }
        return pHead;
    }
};

代码,简单易懂,简洁至上

你可能感兴趣的:(算法题)