链表有关的题目

来源:互联网 发布:中电数据 李世峰 编辑:程序博客网 时间:2024/05/22 08:06

1、一个单链表,不知道长度,写一个函数快速找到中间节点的位置.

答:

【法1】

    typedef struct linknode

    {

      int a;

      struct linknode *next;

    }linknode;

   linknode *findmiddle(linknode *head)

   {

     linknode *fast,*low,*p;

     if(head==NULL)

     {

        return NULL;

     }

     fast=low=head;

     while(!(p=fast->next)&&!p->next)

     {

        low=low->next;

        fast=p->next;

     }

     return low;

   }

【法2】

void searchmid(node* hear, node *mid){

        node *temp = head;

        while(head->next->next != NULL){//此种方法只需在循环中记录移动一步的情况即可,然而此种算法存在问题:没有判断移动一步时是否节点指向NULL,因此我们需要在初始化时,对两需连续两个节点的next赋值为NULL(但是,相比于第一种方法,此种方法并不合适)

head = head->next->next;

temp = temp->next;

mid = temp;

}

 

}

2、写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).

答:两个指针,第一个先于第二个n个位置。

   LinkNode IsLoopList(LinkNode *head,int n)

   {

      LinkNode *p1,*p2,*p3;

   P1 = head;

   While(n-->=0)

   {

     P3= p2->next;

     P2 = p3;

   }

   While(p3->next!=NULL)

   {

P3 = p3->next;

P1 = p1->next;

   }

   Return p1;   //当p3到达结尾时,后于p3n个位置的就是倒数第n个节点。

 }

 

3、判断链表是否存在循环

答:bool IsLoopList(LinkNode *head)

{
 LinkNode *p1= head,*p2= head;
 if(head ->next==NULL)//只包含头节点,且头节点的next为NULL说明肯定不是循环链表
    return false;
 do{
   p1=p1->next;      //步长为1
   p2=p2->next->next; //步长为2
 }while(p2 && p2->next && p1!=p2);
 if(p1==p2)
   return true;
 else
   return false;
}