逆置链表包含K个结点的块

该博客讨论了如何根据给定的K值逆置链表中的K个节点块。例如,对于链表1->2->3->4->5->6->7->8->9->10,当K分别为2, 3, 4时,链表会如何逆置。算法包括检查剩余节点数、逆置节点、更新指针等步骤,并强调了修改指针指向的重要性。" 8225428,1356138,DevExpress LookUpEdit控件实现搜索定位功能,"['DevExpress', 'C#']
摘要由CSDN通过智能技术生成

标题对于给定的K(K>0),逆置链表中包含K个结点的块

例:输入:1 2 3 4 5 6 7 8 9 10 对于不同的K,输出为:
K = 2:2 1 4 3 6 5 8 7 10 9
K = 3:3 2 1 6 5 4 9 8 7 10
K = 4:4 3 2 1 8 7 6 5 9 10

算法:
1)检查链表当前剩余部分是否还有K+1个结点
a)如果有,获取当前链表剩余部分第K+1个结点的指针
b)若没有,则返回
2)逆置前面的K个结点
3)K个结点逆置之后,如果后面还有一个K块,则设置当前K块的最后一个结点的后继指针指向下一个K块的最后一个结点,若没有,则指向剩余部分的第一个结点
4)从当前为止移动到K+1个结点位置
5)继续执行1)
6)如果执行了逆置,那么第一个K块中K-1个结点为新的表头结点,否则返回原表头结点

代码:

	//获取第k+1个结点的指针
	public static ListNode getKPlusOneThNode(int k, ListNode h) {
		ListNode kth;
		int i;
		
		if(h == null) {
			return h;
		}
		for(i = 0, kth = h; kth != null && i < k; i++, kth = kth.getNext());
		if(i == k && kth != null) {
			return kth;
		}
		return h.getNext();
	}
	
	//判断链表剩下的结点是否有k个
	public static boolean hasKNodes(int k, ListNode h) {
		int i;
		for(i = 0; h != null && i < k; i++, h = h.getNext());
		if(i == k) {
			return true;
		}
		return false;
	}
	
	public static ListNode reverseKNodeLink(ListNode h, int k) {
		ListNode temp, next, cur = h, newNode, l;
		if(k == 0 || k == 1) {
			return h;
		}
		//若第一个K块存在,则修改头指针
		if(hasKNodes(k - 1, cur)) {
			newNode = getKPlusOneThNode(k - 1, cur);
		} else {
			newNode = h;
		}
		//判断链表剩余部分是否还有K块
		while(cur != null && hasKNodes(k, cur)) {
			l = cur;//l指向K块的第一个结点,并且逆置后成为最后一个
			temp = getKPlusOneThNode(k, cur);//temp指向K块的最后一个结点,并且逆置后成为第一个
			int i = 0;
			//逆置
			while(i < k) {
				next = cur.getNext();
				cur.setNext(temp);
				temp = cur;
				cur = next;
				i++;
			}
			//逆置之后若后面还有K块,则需要调整当前块的最后一个结点l指向下一块的逆置后的第一个结点
			if(hasKNodes(k, cur)) {
				l.setNext(getKPlusOneThNode(k - 1, cur));
			}			
		}
		return newNode;
	}

在这里一定要记得改指针的指向,尤其是前一个块逆置后的最后一个结点指向后一个块逆置后的第一个结点,这块一定要记得修改,否则就会缺失数据
这是修改后得:
在这里插入图片描述
若没有添加

if(hasKNodes(k, cur)) {
				l.setNext(getKPlusOneThNode(k - 1, cur));
			}

则后面的链表为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值