一、删除链表中的节点(简单)
题目:
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问要被删除的节点 。
题目数据保证需要删除的节点不是末尾节点 。
示例 1: 输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9
示例 2: 输入:head = [4,5,1,9], node = 1 输出:[4,5,9] 解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9
示例 3: 输入:head = [1,2,3,4], node = 3 输出:[1,2,4]
示例 4: 输入:head = [0,1], node = 0 输出:[1]
示例 5: 输入:head = [-3,5,-99], node = -3 输出:[5,-99]
提示: 链表中节点的数目范围是 [2, 1000] -1000 <= Node.val <= 1000 链表中每个节点的值都是唯一的 需要删除的节点 node 是 链表中的一个有效节点 ,且 不是末尾节点
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list
分析:
因为题目只能访问被删除节点 node ,并且该节点不是末尾,所以我们可以利用 node 以及 node.next 来删除 node ,我们可以将 node.next 的值赋给 node ,再把它指向node.next.next
代码:
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
二、删除链表的倒数第N个节点(中等)
题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2: 输入:head = [1], n = 1 输出:[]
示例 3: 输入:head = [1,2], n = 1 输出:[1]
提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
分析:
我们可以遍历链表获取长度,然后再一次遍历链表找到需要删除的节点,直接将其删除即可。
代码:
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
def lengthnode(node):
count = 0
while node != None:
count += 1
node = node.next
return count
q = ListNode(0, head)
l = lengthnode(head)
p = q
for i in range(l - n):
p = p.next
p.next = p.next.next
return q.next
三、反转链表(简单)
题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2: 输入:head = [1,2] 输出:[2,1]
示例 3: 输入:head = [] 输出:[]
提示: 链表中节点的数目范围是 [0, 5000] -5000 <= Node.val <= 5000
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list
分析:
直接将原链表头节点指向 None ,其余节点指向前一节点。
代码:
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or head.next == None:
return head
p = head
q = None
while p:
temp = p.next
p.next = q
q = p
p = temp
return q
四、合并两个有序链表(简单)
题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2: 输入:l1 = [], l2 = [] 输出:[]
示例 3: 输入:l1 = [], l2 = [0] 输出:[0]
提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
分析: 可以通过递归解决这道题,判断哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。
代码:
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
if list1 is None:
return list2
elif list2 is None:
return list1
elif list1.val < list2.val:
list1.next = self.mergeTwoLists(list1.next, list2)
return list1
else:
list2.next = self.mergeTwoLists(list1, list2.next)
return list2
五、回文链表(简单)
题目:
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1: 输入:head = [1,2,2,1] 输出:true
示例 2: 输入:head = [1,2] 输出:false
提示: 链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-linked-list
分析: 直接将链表中的值取出来放入数组中,然后判断是否为回文即可。
代码:
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if head.next == None:
return True
n = []
a = head
while a:
n.append(a.val)
a = a.next
m = len(n)
for i in range(m//2):
m -= 1
if n[i] != n[m]:
return False
return True
六、环形链表(简单)
题目:
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。
提示: 链表中节点的数目范围是 [0, 104] -105 <= Node.val <= 105 pos 为 -1 或者链表中的一个 有效索引 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle
分析: 可以利用快慢指针,一个“跑得慢”,一个“跑得快”,若他们能相遇,则为环形,若跑得快的节点或其下一节点为空,则代表不为环形链表。
代码:
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
if not head or not head.next:
return False
q = head
p = head.next
while q != p:
if not p or not p.next:
return False
q = q.next
p = p.next.next
return True
|