每间隔K个元素逆转一次单链表
来源:互联网 发布:淘宝助理教学视频 编辑:程序博客网 时间:2024/05/01 07:16
例如:
Inputs: 1->2->3->4->5->6->7->8->9->NULL and k = 3
方法2:
时间复杂度为Ο(n)
Inputs: 1->2->3->4->5->6->7->8->9->NULL and k = 3
Output: 3->2->1->4->5->6->9->8->7->NULL.
方法1:
#include<stdio.h>#include<stdlib.h> /* Link list node */struct node{ int data; struct node* next;}; /* Reverses alternate k nodes and returns the pointer to the new head node */struct node *kAltReverse(struct node *head, int k){ struct node* current = head; struct node* next; struct node* prev = NULL; int count = 0; /*1) reverse first k nodes of the linked list */ while (current != NULL && count < k) { next = current->next; current->next = prev; prev = current; current = next; count++; } /* 2) Now head points to the kth node. So change next of head to (k+1)th node*/ if(head != NULL) head->next = current; /* 3) We do not want to reverse next k nodes. So move the current pointer to skip next k nodes */ count = 0; while(count < k-1 && current != NULL ) { current = current->next; count++; } /* 4) Recursively call for the list starting from current->next. And make rest of the list as next of first node */ if(current != NULL) current->next = kAltReverse(current->next, k); /* 5) prev is new head of the input list */ return prev;} /* UTILITY FUNCTIONS *//* Function to push a node */void push(struct node** head_ref, int new_data){ /* allocate node */ struct node* new_node = (struct node*) malloc(sizeof(struct node)); /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*head_ref); /* move the head to point to the new node */ (*head_ref) = new_node;} /* Function to print linked list */void printList(struct node *node){ int count = 0; while(node != NULL) { printf("%d ", node->data); node = node->next; count++; }} /* Drier program to test above function*/int main(void){ /* Start with the empty list */ struct node* head = NULL; int i; // create a list 1->2->3->4->5...... ->20 for( i= 20; i > 0; i--) push(&head, i); printf("Given linked list \n"); printList(head); head = kAltReverse(head, 3); printf("\nModified Linked list \n"); printList(head); getchar(); return(0);}
时间复杂度为Ο(n)
方法2:
// 单链表.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <stdio.h>#include <stdlib.h> /* Link list node */struct node{ int data; struct node* next;}; /* Helper function for kAltReverse() */struct node * _kAltReverse(struct node *node, int k, bool b); /* Alternatively reverses the given linked list in groups of given size k. */struct node *kAltReverse(struct node *head, int k){ return _kAltReverse(head, k, true);} /* Helper function for kAltReverse(). It reverses k nodes of the list only if the third parameter b is passed as true, otherwise moves the pointer k nodes ahead and recursively calls iteself */struct node * _kAltReverse(struct node *node, int k, bool b){ if(node == NULL) return NULL; int count = 1; struct node *prev = NULL; struct node *current = node; struct node *next; /* The loop serves two purposes 1) If b is true, then it reverses the k nodes 2) If b is false, then it moves the current pointer */ while(current != NULL && count <= k) { next = current->next; /* Reverse the nodes only if b is true*/ if(b == true) current->next = prev; prev = current; current = next; count++; } /* 3) If b is true, then node is the kth node. So attach rest of the list after node. 4) After attaching, return the new head */ if(b == true) { node->next = _kAltReverse(current,k,!b); return prev; } /* If b is not true, then attach rest of the list after prev. So attach rest of the list after prev */ else { prev->next = _kAltReverse(current, k, !b); return node; }} /* Function to push a node */void push(struct node** head_ref, int new_data){ /* allocate node */ struct node* new_node = (struct node*) malloc(sizeof(struct node)); /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*head_ref); /* move the head to point to the new node */ (*head_ref) = new_node;} /* Function to print linked list */void printList(struct node *node){ int count = 0; while(node != NULL) { printf("%d ", node->data); node = node->next; count++; }} /* Drier program to test above function*/int main(void){ /* Start with the empty list */ struct node* head = NULL; int i; // create a list 1->2->3->4->5...... ->20 for(i = 20; i > 0; i--) push(&head, i); printf("Given linked list \n"); printList(head); head = kAltReverse(head, 3); printf("\nModified Linked list \n"); printList(head); getchar(); return(0);}
时间复杂度为Ο(n)
- 每间隔K个元素逆转一次单链表
- 以每K个元素为一组逆转单链表
- 单向链表每k个元素翻转一次。
- 单向链表每k个元素翻转一次。
- 每K个元素翻转一次链表,若最后剩余元素不足K个,不进行翻转(美团2014校招试题)
- 一次遍历找出单链表中的倒数第k个元素
- 每天一道LeetCode-----将链表每k个节点逆序一次
- C语言实现单链表的逆转指定个数个元素
- 每10个显示一次
- 链表翻转(每K个结点进行一次逆置)
- setTimeout改进 每间隔0.1秒移动一次改进
- 单链表的原地逆转 (只遍历一次)
- 查找单链表倒数第k个元素
- 单链表查找倒数第k个元素
- 链表翻转,每K个数翻转一次。
- css3 animate动画每循环一次的时间间隔设置方法
- K链表逆转
- 最小的k个元素
- LoadRunner简单应用之:关联HTTP请求
- 解决linux,unzip 解压后中文名出现乱码现象
- Eclipse与Android2.2开发环境配置
- RAC 的一些概念性和原理性的知识
- 使用DMO获取缓存里的执行计划
- 每间隔K个元素逆转一次单链表
- mongoDB——自动分片介绍及简单实现
- org.apache.hadoop.security.AccessControlException: Permission denied: user=xxj, acces
- 婴儿常见问题总结
- 组件映射配置
- 迅雷校园面试题
- 美团网2014年校园招聘笔试题(哈工大)
- CSS样式命名整理
- 学习笔记-XML基础