链表的反转-leetcode

LeetCode- 206 反转链表

思路1:迭代反转
可以使用虚拟头节点来进行头插法
思路2:递归反转(一次拆掉一个节点并递归处理剩余的子链表)
解题重点:
一定要有三个指针,一个放反转前,一个放翻转后,一个放反转时

class Solution: 
	def reverseList(self, head: ListNode) -> ListNode: 
		pre = None 
		cur = head 
		while (cur): 
			tem = cur.next 
			cur.next = pre 
			pre = cur 
			cur = tem 
		return pre

LeetCode 92 反转链表II

使用虚拟头结点(dummy head)
通常用于链表的首地址有可能改变的情况
解题重点:
1.与上一题反转链表函数无大差异,但是需要改变反转停止条件,此时为反转K个链表
2.主体函数找到起始反转位置即可,剩下的交给反转函数
3.找到起始反转位置的前一个结点,方便反转后链接

class Solution: 
	def reverse(self,head,k):#反转k个链表 
		pre = None 
		cur = head 
		for _ in range(k): 
			tem = cur.next 
			cur.next = pre 
			pre = cur 
			cur = tem 
		head.next = cur 
		return pre 
		
	def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode: 
	empty = ListNode() 
	empty.next = head 
	p = empty 
	for _ in range(left - 1): 
		p = p.next 
	p.next = self.reverse(p.next,right - left + 1) 
	return empty.next

LeetCode 25 K个一组翻转链表

思路:先判断是否有K个元素 然后对这K个节点进行反转 最后拆装一下首尾部分
解题重点:
1.保证反转函数正确,反转函数需要判断传入的链表是否满足k个结点
2.主体函数通过找到起始反转位置,同时判断下一个位置够不够k个(题目要求剩余的结点不足k
个则保留
3.一定需要将复杂问题拆分解决,先解决反转函数,然后反转函数升级改造为要判断K个结点

class Solution: 
	def reverse(self,head,k):#反转K个结点(这个函数的链表输入不一定是有k个链表的) 
			pre = head#pre = None 
			cur = head 
			cnt = 0
			while (pre and cnt < k - 1):#传入的需要被反转的链表是否够k个 
				pre = pre.next 
				cnt += 1 
			if pre == None:return head 
			pre = None#出bug的时候:这儿是没有的 
			for _ in range(k): 
				tem = cur.next 
				cur.next = pre 
				pre = cur 
				cur = tem 
			head.next = cur 
			return pre
	
	def reverseKGroup(self, head: ListNode, k: int) -> ListNode: 
		empty = ListNode() 
		empty.next = head 
		pre = empty 
		while (1): 
			pre.next = self.reverse(pre.next,k) 
			cnt = 0 
			while pre and cnt < k:#判断接下来的链表结点够不够k个 
				cnt += 1 
				pre = pre.next 
			if pre == None:
				break 
		return empty.next

LeetCode 61 旋转链表

思路:把整个链表首尾相接 向后走K位后将环拆开
解题重点:
1.将问题转化为环形链表重新剪开环(贪吃蛇现象)
2.如何将链表成环,成环操作
3.将右边第K个结点旋转,转化为从头部到第len-k个位置,但是剪开环的时候需要他的前一个位
置才能操作
4.需要得到新的链表头的地址,然后再操作剪环

class Solution: 
	def rotateRight(self, head: ListNode, k: int) -> ListNode: 
		if not head or not head.next: return head 
		pre = head 
		length = 1 
		while pre.next: 
			pre = pre.next 
			length += 1 
		k = k % length 
		pre.next = head#链表成环了 
		for _ in range(length - k - 1):#保证拿到第len-k的结点的地址, 
			head = head.next 
		new_head = head.next #保证newhead地址,我们先拿到手 
		head.next = None#断开结点 
		return new_head

LeetCode #24 两两交换链表中的节点

思路与LeetCode #25完全一致,是K = 2的简单情形。
解题重点:
1.K个链表反转的特例,将K=2即可
2.直接两两反转也是很简单的,保证反转时有三个指针标记地址即可,切记画图!!!\

class Solution: 
	def swapPairs(self, head: ListNode) -> ListNode: 
		if not head:return None 
		empty = ListNode() 
		empty.next = head 
		T = empty 
		while T.next and T.next.next: 
			node1 = T.next 
			node2 = T.next.next 
			T.next = node2 
			node1.next = node2.next 
			node2.next = node1 
			T = node1 
		return empty.next
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
反转句子"leetcode"可以使用以下步骤: 1. 将句子转换为字符数组。 2. 使用两个指针,一个指向句子的开头,一个指向句子的末尾。 3. 交换指针所指向的字符,然后将指针向中间移动。 4. 重复步骤3,直到指针相遇。 5. 最后将字符数组转换回字符串。 参考中的问题是关于反转字符串的,其中提到了反转链表,但是与我们要解决的问题不相关。而参考和提到了反转链表和旋转数组的问题,但是也不适用于我们的情况。因此,以上的步骤是针对反转句子而提供的解决方法,没有直接关联到参考内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode之倒转一句话单词](https://blog.csdn.net/xunileida/article/details/42154205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [leetcode反转链表问题](https://download.csdn.net/download/weixin_38714532/13743273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [LeetCode反转](https://blog.csdn.net/qq_41994151/article/details/105855495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值