相对于翻转整个链表而言,主要是对head指针的初始化改为对应节点的next,及翻转的while判断对应到指定节点即可。
/*************************************************************
reverse_list.c
auther:yejing
data:2014/10/21 creat file 1.0
2015/01/04 modified for partition reverse of a list 1.1
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct node_s{
int item;
struct node_s* next;
}node_t;
void show_list(node_t* list);
node_t* search_for_key_pointer(int n, node_t* head){
node_t* tmp = head;
while(tmp){
if(n == tmp->item)
return tmp;
tmp = tmp->next;
}
return NULL;
}
node_t* reverse_part_of_list(node_t* head, int index){
if(!head)
return;
node_t* n = head;
head = search_for_key_pointer(index, head)->next;
while(n && n->item <= index){
node_t* m = n;
n = n->next;
m->next = head;
head = m;
}
printf(" -----reverseing list-----\n");
return head;
}
node_t* creat(int n)
{
node_t* phead = (node_t*)malloc(sizeof(node_t));
if(!phead)
return NULL;
int i;
node_t *p, *q;
p = phead;
phead->item = 1;
for(i = 0; i < n - 1; ++i)
{
q = (node_t *)malloc(sizeof(node_t));
if(!q)
return;
p->next = q;
q->item = i + 2;
p = q;
}
return phead;
}
void show_list(node_t* list)
{
if(!list)
return;
while(list){
printf(" item of listnode is: %d \n", list->item);
list = list->next;
}
return;
}
int main(int argc, char* argv[])
{
node_t* list = creat(5);
show_list(list);
list = reverse_part_of_list(list, 4);
show_list(list);
return 1;
}