数据结构学习:有关带头结点的单向链表的常见考题(c语言)
1.将链表中pp结点之后的结点原地逆置(反转)。
解题思路:
通过设置两个指针ss\ssnext指针,其中一个ss指针指向pp结点的下一个节点,将pp指针后面的结点置空,留下链表中在pp结点前的元素,再利用设置的另一指针ssnext指针保存ss指针下一结点的信息,接着将ss指向的结点插入pp结点的后面,ss指针接着再指向指向下一结点,直到ss指针为空。
//1.将链表中pp结点之后的结点原地逆置(反转)。
void ReverseList(LNode *pp)
{
LNode *ss,*ssnext;//设置两个指针ss\ssnext。
ss=pp->next;//ss指针指向pp结点的下一个节点。
pp->next=NULL;//将pp指针后面的结点置空,留下链表中在pp结点前的元素。
while(ss!=NULL)
{
ssnext=ss->next;//ssnext指针保存ss指针下一结点的信息。
//将ss指向的结点插入pp结点的后面。
ss->next=pp->next;
pp->next=ss;
ss=ssnext;//ss指针接着再指向下一结点。
}
}
2.反向打印链表中全部的元素。
解题思路:
利用递归实现,当指针一直没有指向表尾时,便一直调用自身函数,直到指针为空返回,便从链表结尾从后往前执行输出语句。 时间复杂度为O(n)。
//2.反向打印链表中全部的元素。
void PrintList1(LNode *pp)
{
if(pp == NULL) return;//判断指针是否为空。
PrintList1(pp->next);//调用自身函数。
printf("%3d",pp->data);//输出语句。
}
3.找出带头结点的单链表倒数第k(k>0)个结点。
解题思路:
可以设置两个指针,一个先出发设为fast指针,一个后出发设为slow指针,先让fast指针从表头移动到正数第k个结点,再设置另slow指针保持与先出发的指针一样的速度,向后移动,直到fast指针移动到表尾,这时slow移动的位置就是表长减去k的位置,也就是倒数第k个位置。
//3.找出带头结点的单链表倒数第k(k>0)个结点。
LNode *FindKNode(LinkList LL,unsigned int kk)
{
LNode *fast=LL;//设置一个先出发的fast指针。