要求:给定一条链表,实现链表中K个元素的逆序
思路:
1.建立三个指针,用old指针来指向需要更改的节点,用tmp来储存old->next节点
2.当old跟new指向同一个节点时,说明k的元素的逆序已完成,再通过new和old及头节点来链接未改变的元素即可
参考代码(仅提供思路,未编译,可能有些许语法错误)
void* nixu(int n, int k, List* p)
//在链表p中,从第i个元素开始逆转k个元素
{
List* New, old, tmp;
List* head;//用于指向逆转元素前的最后一个元素,以便最后实现逆序的链接
int cnt = 0;//让指针new指向需要逆序的第一个节点
for (; cnt < n; cnt++)
{
head = New;
New = p->next;}
old = New->next;//这里让tmp先指向old,方便逆转元素结束时tmp和old指向同一个元素
tmp = old;//逆转k个元素
for (int i = 0; i < k; i++)
{
//用tmp来指向下一个需要操作的元素,防止因为逆转后无法找到链表的其他节点
tmp = old->next;
//让old所指的元素逆转,指向上一个元素new;
old->next = New;
//后移指针
New = old;
old = tmp;}
//*此时已经实现了k个元素的逆序,只需要将前面的元素指向
//逆序后的第一个元素,再将后面没逆序的元素链接起来即可
head->next = old;//将逆序前的头一个元素和未逆序的元素链接
head = New;//指向逆序后的第一个元素}
当然还需要考虑一些临界问题和数据可行性的检测,如n过大越界,k=1不需要逆转,k到达边界等。 本篇不做详细讨论