在单链表这块其实不是很难,但是有的问题是很经典,这里关于经典的逆置我有5中方法,大家可以参考:
1.有两个指针一个指向头,一个指向尾。再取一个中间变量tmp ,只换data值就可以(次数控制好,是总长的一半)
2.再开辟一个单链表,直接进行尾删,尾插。(次数是总长)
3.在一个单链表中进行。尾删,中间插。
4.与第三个大致相同,头删中间插。
5.
.
其实:我大致就只能想到这里,还有一个想法写不出来!以后会自己考虑:
现在看看代码:
1.
bool rev_link_list(NODE *phead)
{
NODE *p = phead;
NODE *s = phead;
NODE *r = phead;
if(phead == NULL || is_empty(phead))
{
return false;
}
elem_type tmp;
for(int i = 0;i < get_length(phead); i++)
{
p = p->next;
}
s = p;
p = phead->next;
for(int i = 0;i < (int) get_length(phead) / 2; i ++)
{
tmp = p->data;
p->data = s->data;
s->data = tmp;
r = p->next;
p = phead;
for(int j = 0;j < get_length(phead)-1-i; j++)
{
p = p->next;
}
s = p;
p = r;
}
return true;
}
2.
NODE * rev_link_list_a(NODE *phead)
{
elem_type tmp;
NODE *p = phead->next;
NODE *pheadA = init_link_list_ex();
if(phead == NULL || is_empty(phead))
{
return NULL;
}
for(int j = 0;j < get_length(phead); j++)
{
insert_head(pheadA,p->data);
p = p->next;
}
return pheadA;
}
3.
bool rev_link_list_b(NODE *phead)
{
elem_type e;
int pos = 0;
if(phead == NULL || is_empty(phead))
{
return false;
}
for(int j = 0;j < get_length(phead); j++)
{
delete_tail(phead,&e);
insert(phead,pos,e);
pos ++;
}
return true;
}
4.
bool rev_link_list_c(NODE *phead)
{
elem_type e;
int pos = get_length(phead) - 1;
if(phead == NULL || is_empty(phead))
{
return false;
}
for(int j = 0;j < get_length(phead); j++)
{
delete_head(phead,&e);
insert(phead,pos,e);
pos -- ;
}
return true;
}
5.
NODE * rev_link_list_d(NODE *phead)
{
NODE *p = phead;
NODE *s = phead;
if(phead == NULL || is_empty(phead))
{
return NULL;
}
if(phead->next && phead->next->next)
{
p = phead->next;
s = p->next;
p->next = NULL;
while(s)
{
p = s;
s = s->next;
p->next =phead->next;
phead->next = p;
}
}
return phead;
}
结果就不显示了,就是逆置。期待地六种方法!