链表专项练习(一)


示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head:
            return
        pre = None
        cur = head
        
        while cur:
            tmp = cur.next
            cur.next = pre
            pre = cur
            cur = tmp
        return pre

+92.反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        dummy_node = ListNode(-1)
        dummy_node.next = head
        pre = dummy_node
        for _ in range(left - 1):
            pre = pre.next

        cur = pre.next
        for _ in range(right - left):
            next = cur.next
            cur.next = next.next
            next.next = pre.next
            pre.next = next
        return dummy_node.next
  • 328.奇偶链表
    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        if not head:
            return
        even,odd = head.next, head
        evenhead = head.next
        while even and even.next:
            odd.next = even.next
            odd = odd.next
            even.next = odd.next
            even = even.next
        odd.next = evenhead
        return head

+[86.分隔链表] (https://leetcode-cn.com/problems/partition-list/)
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

示例:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        if not head:
            return
        large = ListNode(-1)
        small = ListNode(-1)
        cur = head
        largeCur = large
        smallCur = small

        while cur:
            if cur.val >= x:
                largeCur.next = cur
                cur = cur.next
                largeCur = largeCur.next
                largeCur.next = None
            else:
                smallCur.next = cur
                cur = cur.next
                smallCur = smallCur.next
                smallCur.next = None
        smallCur.next = large.next
        return small.next

+203.移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        sen = ListNode(0)
        sen.next = head
        pre,cur = sen,head
        while cur:
            if cur.val == val:
                pre.next = cur.next
            else:
                pre = cur
            cur = cur.next
        return sen.next

评论
 Previous
链表专项练习(二) 链表专项练习(二)
[83.删除排序链表中的重复元素] (https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/)给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
Next 
动态规划专项练习(二) 动态规划专项练习(二)
打开题目->思索半天->打开题解->思索一会->妙不可言->我是废物+198.打家劫舍示例 输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)
2021-02-06
  TOC