LeetCode:206. Reverse Linked List
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
翻转链表。
思路一:头插法
遍历链表,直接将元素插入到头部前面,最后链表就翻转过来了。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
p = head
headTmp = head
if (p != None):
while(p != None):
#p.next移到p前面
if (p.next != None):
tmp = p.next
p.next = tmp.next
tmp.next = headTmp
headTmp = tmp
else:
break
return headTmp
思路二:递归
假设原始链表为:
n
1
→
.
.
.
→
n
k
→
n
k
+
1
→
.
.
.
→
n
m
→
N
o
n
e
n_1 \rightarrow ... \rightarrow n_k \rightarrow n_{k+1} \rightarrow ... \rightarrow n_m \rightarrow None
n1→...→nk→nk+1→...→nm→None
如果从k+1开始的后半部分已经完成了翻转,则此时链表为:
n
1
→
.
.
.
→
n
k
→
n
k
+
1
←
.
.
.
←
n
m
n_1 \rightarrow ... \rightarrow n_k \rightarrow n_{k+1} \leftarrow ... \leftarrow n_m
n1→...→nk→nk+1←...←nm
于是我们下一步就是要把 . . . n k → n k + 1 . . . ...n_k \rightarrow n_{k+1}... ...nk→nk+1... 这里的箭头翻转变为 n k + 1 ← n k n_{k+1} \leftarrow n_{k} nk+1←nk
用代码表示就是 n k . n e x t . n e x t = n k n_k.next.next = n_k nk.next.next=nk,因为 n k . n e x t = n k + 1 n_k.next = n_{k+1} nk.next=nk+1 ,再加一个next 就表示指向它自己。然后依次类推向前递归。
注意这里下标只表示位置,实际该位置的元素已经翻转了。
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if (head == None or head.next == None):
return head
# 这里的p最终指向末尾那个元素,也是作为翻转之后的头部
p = self.reverseList(head.next)
# 这个head是待翻转的那个元素
head.next.next = head
head.next = None
return p
以 1->2->3->4->5->NULL 为例,这个递归的过程就是以1开头为head,假设后半部分已经递归完成变为2<-3<-4<-5,这个链表为1->2<-3<-4<-5。然后将2的next再指向1即可。
THE END.