例题1 移除链表元素
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeElements(self, head, val):
head = ListNode(next = head)
pre = head
while pre.next:
if pre.next.val == val:
pre.next = pre.next.next
else:
pre = pre.next
return head.next
因为在删除链表中元素a的时候,需要把元素a前面的一个元素链接到a后面的一个元素上去。因此在循环过程中,立足于pre这个节点,如果pre.next的值等于给定的val,就把pre.next更新为pre.next.next。
例题2 旋转链表
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head:
return None
length = 0
temp = head
while temp.next:
length += 1
temp = temp.next
temp.next = head
# 让原链表的最后一个元素指向原链表的head,相当于变成了一个循环链表
k = k % (length + 1) # length + 1 为链表的长度
temp = head
# 需要将第k、k+1个元素处断开,需要找到第k个元素,令其指向none,同时令第k+1个元素成为head
for i in range(length - k):
temp = temp.next
head = temp.next
temp.next = None
return head