206. Reverse Linked List
题目描述
反转单链表
例子
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
解法
easy题目,分为两种解法:递归和非递归
解法1
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
node = self.reverseList(head.next)
head.next.next = head
head.next = None
return node
解法2
非递归解法,定义两个指针
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pre = None
cur = head
while cur:
temp = cur.next
cur.next = pre
pre, cur = cur, temp
return pre
92. Reverse Linked List II
题目描述
反转链表 - 从位置m到位置n
例子
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
思路
开始写的时候发现很麻烦,好几个特殊用例(比如m=1)要考虑。所以考虑加一个dummy结点。
把要翻转的一段先进行翻转,再把它和前后的链表接起来
解法
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
dummy = ListNode(-1)
dummy.next = head
node = dummy
for _ in range(m-1):
node = node.next
pre = node.next
cur = pre.next
for _ in range(n-m):
temp = cur.next
cur.next = pre
pre, cur = cur, temp
# 先和后面串起来
node.next.next = cur
node.next = pre
return dummy.next