链表的k子段逆转

题目:

原链表为1->2->3->4->5->6->7

k=3的子段逆转结果为

3->2->1->6->5->4->7

code:

关键点

首子段要记录整个链表的头指针,记录相邻两字段的尾节点

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <hash_map>
using namespace std;

typedef struct node
{
	int data;
	struct node* next;
}*pList,Node;

void rReverse(pList &list,int k)
{
	pList p=list, tail, pretail;
	tail=p;
	int flag=0;
	while(p!=NULL)
	{
		int n=k;
		pList post=p->next;
		tail=p;

		while(post!=NULL && n--!=1)
		{
			pList temp=post->next;
			post->next=p;
			p=post;
			post=temp;
		}

		if(post!=NULL && flag==0)
		{
			list=p;
			pretail=tail;
			flag=1;
			p=post;
		}
		else if(post!=NULL)
		{
			pretail->next=p;
			pretail=tail;
			p=post;
		}
		else
		{
			pretail->next=p;
			tail->next=NULL;
			break;
		}
	}
}

int s[7]={1,2,3,4,5,6,7};

void createList(pList& head)
{
	head=new Node;
	pList p=head;

	for(int i=0;i<7;i++)
	{
		p->next=new Node;
		p->next->data=s[i];
		p=p->next;
	}
	p->next=NULL;

	p=head;
	head=head->next;
	delete p;
}

void showList(pList head)
{
	pList p=head;

	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

int main(void)
{
	pList head;

	createList(head);
	showList(head);
	rReverse(head,4);
	showList(head);

	system("pause");
	return 0;
}

时间: 2024-10-21 14:40:37

链表的k子段逆转的相关文章

算法--链表的K逆序问题

转载请标明出处http://www.cnblogs.com/haozhengfei/p/9e6f4dda3138cf9fab17f996ec85b624.html 链表的K逆序问题 链表的k逆序 第7节 链表的k逆序练习题 有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如链表1->2->3->4->5->6->7->8->null,K=3这个例子.调整后为,3->2->1->6-&g

【LeetCode-面试算法经典-Java实现】【025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)】

[025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes i

HDU 3415 Max Sum of Max-K-sub-sequence 最长K子段和

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415 题意:给出一个数环,要找出其中9长度小于等于K的和最大的子段. 思路:不能采用最暴力的枚举,题目的数据量是10^5,O(N^2)的枚举回去超时,本题采用的很巧妙的DP做法,是用单调队列优化的DP. 运用的是STL的deque,从i:1~a找到以其中以i为尾的符合条件的子段,并将i本身放入双向队列,所有i从队列后放入,保证了队列的单调性. 代码: #include <iostream> #incl

华为机试—链表翻转(给出链表和数K)

题目: 给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6 基本思想: 链表中长度为k的一段从链表中摘除,翻转之后在将其衔接回链表. #include<iostream> using namespace std; typedef struct LNode { int m_nValue; struct LNode* m_pNext; }LNode; LNode* rever

链表——按k个结点一组来反转链表

题目:按k个结点一组来反转链表 思路: 运用反转链表的通法reverse,对链表进行循环,当计数长度k不时,指针继续前进:当计数长度到达k时,将该组首尾节点first和node作为参数传入翻转函数reverse进行翻转,然后重新拼接到原链表中.直至到达链表末尾. 代码如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x)

PTA 单链表分段逆转

6-9 单链表分段逆转 (25 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4→3→2→1→5→6. 函数接口定义: void K_Reverse( List L, int K ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data;

Leetcode25---&gt;Reverse Nodes in k-Group(以k个节点为段,反转单链表)

题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点:如果链表不足k个,则不变 举例: Given this linked list: 1->2->3->4->5 For k = 2, you should return: 2->1->4->3->5 For k = 3, you should return: 3->2->1->4->5 解题思路: 1.  首先要确定链表的头节点newHead;即如果链表的节点个数大

单链表的逆转

算法导论:10.2-7 给出一个 O(n) 时间的非递归过程,实现对一个含有 n 个元素的单链表的逆转.要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间. #ifndef _SINGLY_LINKED_LIST_H #define _SINGLY_LINKED_LIST_H /*********************************************************** 10.2-7 单链表类,并实现了在 O(n) 时间内链表的逆转 ***********

逆转单链表

(没有头节点的)其中 List 跟 Position 是结构指针: typedef struct Node { int value; struct Node *next; } *List; typedef List Position; List ReverseList( List L ) { // Assuming no header. if( L == NULL ) return L; Position PreviousPos, CurrentPos, NextPos; PreviousPos