leetcode-206-Reverse-Linked-List 反转链表
1. 题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
2. 解
2.1 方法一:借用栈结构反转
借用Python中list中的insert()函数实现栈结构,用栈来反转。
需要注意的是:整个过程中,不动head结点,新初始化一个结点p来遍历链表。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
p = head
newList = []
while p:
newList.insert(0,p.val)
p = p.next
p = head
for x in newList:
p.val = x
p = p.next
return head
2.2 方法二:迭代反转
其实就是头插法。
当怎么想都想不通的时候,其实是这里出问题了:
这里的链表是 1->2->3->4
最重要的是:head 就是 1 这个节点,head = 1
并不是 head -> 1 (head.next = 1) 这个是最致命的错误思路,不是head指向1,而是head就是1,head和1就是同一个节点,1 这个节点就是所谓的头结点
只要把head和1想成同一个节点,问题就都解决了
2.2.1 头插法一:
在链表中反转(head的后继结点插入链表头)
head遍历链表。t为head的后继结点,反转操作主要是:
head指向head.next.next(即为t.next,把t摘下来),t插入链表头(t.next = new_head),重置头结点(new_head = t)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head is None:
return head
# new_head保存链表头,head遍历链表
new_head = head
while head.next is not None:
t = head.next
head.next = head.next.next
t.next = new_head
new_head = t
return new_head
2.2.2 头插法二:
链表拆分为两条(head的前序结点插入链表头)
head遍历链表,p为head的前序结点,反转操作主要是:
将前序结点p直接插在新链表new_head之前(p.next = new_head),重新将new_head指向头结点(new_head = p)。
1 | # Definition for singly-linked list. |
2.3 方法三:递归
1 | # Definition for singly-linked list. |