LeetCode Notes_#206 Reverse Linked List(C++,Python)
Contents
题目
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
思路
思考
-
为什么要使用两个指针?
- 因为每次进行逆转操作必然涉及到两个节点,head(后)->next = new_head(前),所以必然是两个指针
- 两个指针指向的就是当前操作到的两个相邻的节点,另一个角度来说,也可以看做
- 正在被拆分的原链表的头,命名为head;
- 正在被构造的新链表的头,命名为new_head;新链表往前延伸(这也有点和惯常思维不一样),好像一个栈,从顶部加入新元素,先加入的反而排在后面
- 严格来说是三个,为了不断遍历,一开始还需要把head->next备份下来。正是由于指针有点多,所以很容易糊涂。要时刻明确每一个指针存在的意义。
-
写循环的思路?
- 循环条件是什么?
- 遍历到链表的最后
- 循环体是什么?
- 先考虑中间的情况(普遍),再去考虑头和尾的情况(特殊)
- 用哪一种循环(for还是while?)
- 因为不确定循环次数,所以是while
- 循环条件是什么?
- 关于链表的头指针?
- 头指针直接指向第一个存储数据的节点
- 为什么这题里边new_head初始化为Null?
其实并没有被用到,因为第一次进入循环就赋值为new_head = head
初始化为Null只是因为必须初始化.- 第一次用到了,其实是作为新链表的最后一个节点
- C++ 不要忘记指针变量的初始化
解答
C++
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* new_head = NULL;
while(head){
ListNode* next = head->next;
head->next = new_head;
new_head = head;
head = next;
}
return new_head;
}
};
Python
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
new_head = None
while(head):
next = head.next
head.next = new_head
new_head = head
head = next
return new_head