1.删除给定节点,题目面试题 02.03. 删除中间节点 - 力扣(LeetCode)
解题思路。要删除给定的某个结点a,可以使他自身变为下一个结点b,然后在让a指向b的下一个结点c。在结果上来看,a就好像被删除了一样。“我杀不了我自己,那我就成为你,再杀了你。”
python3代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
node.val=node.next.val
node.next=node.next.next
2.删除链表的第N个结点,题目19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
解题思路。我们可以先定义两个快慢指针,让快指针先走,使他们的距离为N。然后让这两个指针以同样的速度一起行走,直到快指针走到末尾。此时删除慢指针的下一个结点即可。在删除结点时我们要考虑到删除头节点的情况,为了将头节点和其他结点以相同情况讨论,我们可以添加一个虚拟头节点dummy。代码如下
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy=ListNode(0)
dummy.next=head
fast,slow=dummy,dummy
#fast先走n步
while(n):
fast=fast.next
n-=1
#fast,next一起走,fast走到末尾停止
while(fast.next):
fast=fast.next
slow=slow.next
#删除slow.next结点
slow.next=slow.next.next
return dummy.next
3.反转链表,题目LCR 024. 反转链表 - 力扣(LeetCode)
3.1头插法实现反转链表
解题思路,先创建一个新的链表结点。然后将旧链表的结点依次插入到新链表的头部。代码如下
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
node=None
while(head):
tnode=head.next
head.next=node
node=head
head=tnode
return node