day1/力扣/代码随想录/链表

本文探讨了如何使用双指针和递归方法实现链表的反转,同时介绍了删除特定值节点及删除倒数第n个节点的算法。通过实例讲解了快速定位和移除目标节点的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反转链表

null→1(head)→2→3→4→5→null
解法1:双指针解法
①初始化:
pre = null,cur = head
还需要temp指针用于保存cur指针的下一结点,否则当结点反转时,cur指针无法后移到下一结点。
②明确循环停止条件:
最后一步应该是:pre = 4,cur = 5
下一步应该退出循环,不满足循环条件:pre = 5,cur = null
所以循环条件可以是:cur != null

class Solution:
	def reverseList(self,head):
		pre = null 
		cur = head
		while(cur != None):
			temp = cur.next
			cur.next = pre  # 反转
			pre = cur
			cur = temp
		return pre  # 此时head=5,顺着打印出来

解法2:递归解法

class Solutiondef reverse(self,pre,cur):
		if(cur == None):
			return pre
		temp = cur.next
		cur.next = pre
		pre = cur
		cur = temp
		return self.reverse(pre,cur)
	def reverseList(self,head):
		return self.reverse(None,head)  # 初始化

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

无虚拟头结点
①判断头结点是否需要删除:【7,7,7】,val=7;【7,6,8】,val=7;【7】,val=7
②判断其它结点是否需要删除:【6,7,7,8】,val=7

class Solution:
	def removeVal(self,head,val):
		while head.next and head == val:  # while:当头结点=val,下一结点也=val
			head = head.next
		if(head == None):  # 当链表都被移除,返回None
			return head
		cur = head
		while cur.next:
			if(cur.next == val):  # 当两个val相邻时,移除一个后应该接着判断下一结点是否等于val
				cur.next = cur.next.next
			else:
				cur = cur.next
		return head

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点

快慢指针法

定义一个快指针和一个慢指针,快指针后移n步,接着快慢指针一起后移,当快指针后移到尾结点时,慢指针在倒数第n+1的位置。
首先创建一个虚拟头结点,好处:
①方便删除第一个结点

class Solution:
	def removeNth(self,head,n):
		fast = dummyNode(next = head)
		slow = dummyNode(next = head)
		for i in range(n):
			fast = fast.next 
		while(fast.next):
			fast = fast.next
			slow = slow.next
		slow.next = slow.next.next
		return dummyNode.next
力扣(LeetCode)是一个在线的编程题库,常用于算法练习。在Python中,链表的调试通常涉及到处理指针、节点数据以及链表的操作。如果你遇到链表相关的题目,比如反转链表、删除节点、查找特定元素等,调试代码可能会涉及以下步骤: 1. **理解题意**:首先要明确题目要求,例如操作的目标是修改链表结构还是返回某些值。 2. **创建链表**:使用ListNode或自定义的Node类来表示链表节点,并定义一些基本属性如value(存储数据),next(指向下一个节点的指针)。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` 3. **函数编写**:编写函数来完成题目所需的操作,比如遍历链表,查找节点,插入节点等。记得考虑边界条件和异常情况。 4. **测试用例**:编写单元测试用例来验证代码功能是否正常。可以创建简单的链表实例并运行函数,观察结果是否符合预期。 5. **调试**:如果代码报错或结果不符,检查循环、递归、指针更新等部分,可能是逻辑错误或对链表性质理解有误。 6. **添加日志或print语句**:在关键点打印节点信息或变量值,帮助定位问题所在。 7. **逐行排查**:逐行检查代码,查看是否有明显的语法错误或逻辑问题,如忘记初始化指针、错误地设置next等。 8. **利用IDE工具**:利用IDE的debugger功能可以帮助更精确地找到问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石头猿rock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值