反转链表

## 题目描述
输入一个链表,反转链表后,输出新链表的表头。

## Solution
> 使用了一个栈,存储链表每个节点的指针,无需新建节点

```c++
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead == NULL) return pHead;
        stack s;
        ListNode* p = pHead;
        while(p->next){
            s.push(p);
            p = p->next;
        }
        //这里判断写成p->next可以免去最后一个节点入栈;如果写成p,下面循环之前还有一次弹栈
        pHead = p;
        while(!s.empty()){
            p->next = s.top();
            p = p->next;
            s.pop();
        }
        p->next = NULL;
        return pHead;
    }
};
```

> Python version
```python
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if pHead == None:
            return None
        s = []
        p = pHead
        while p.next != None:
            s.append(p)
            p = p.next
        pHead = p
        for i in range(len(s))[::-1]:
            p.next = s[i]
            p = p.next
        p.next = None
        return pHead
```

> 也可以不用栈或者队列存储
```python
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        # 可以直接写成not pHead
        if not pHead or not pHead.next:
            return pHead
        newHead = None
        while pHead:
            tmp = pHead.next
            pHead.next = newHead
            newHead = pHead
            pHead = tmp
        return newHead
```

你可能感兴趣的:(做题)