Linked list 到达链表的最后一个节点,而不遍历整个链表

Linked list 到达链表的最后一个节点,而不遍历整个链表,linked-list,nodes,traversal,Linked List,Nodes,Traversal,我在一次采访中被问到这个问题: 您将获得指向标题的指针,但不允许 遍历整个列表。您将如何到达最后一个节点 我试过了,但没有找到任何答案。有人能帮忙吗?术语“header”不仅仅意味着指向head节点的指针。鉴于典型的链表标题包含指针*head、*current和*tail,我认为这个问题是对惯用知识而非算法知识的测试。术语“header”不仅仅意味着指向head节点的指针。鉴于典型的链表标题包含指针*head、*current和*tail,我认为这个问题是对惯用知识而非算法知识的测试。术语“he

我在一次采访中被问到这个问题:

您将获得指向标题的指针,但不允许 遍历整个列表。您将如何到达最后一个节点


我试过了,但没有找到任何答案。有人能帮忙吗?

术语“header”不仅仅意味着指向head节点的指针。鉴于典型的链表标题包含指针
*head
*current
*tail
,我认为这个问题是对惯用知识而非算法知识的测试。

术语“header”不仅仅意味着指向head节点的指针。鉴于典型的链表标题包含指针
*head
*current
*tail
,我认为这个问题是对惯用知识而非算法知识的测试。

术语“header”不仅仅意味着指向head节点的指针。鉴于典型的链表标题包含指针
*head
*current
*tail
,我认为这个问题是对惯用知识而非算法知识的测试。

术语“header”不仅仅意味着指向head节点的指针。考虑到典型的链表标题包含指针
*head
*current
*tail
,我认为这个问题是对惯用知识而不是算法知识的测试。

请看,我没有找到一种方法可以快速遍历链表中的最后一个节点
也许有办法做到这一点,但这并不直接。您可以使用一个循环链接列表。该循环列表必须是双向循环链表,以下是双向循环链表实现的代码

#include<stdio.h>
#include<conio.h>

//Structure for Two Way Circular Linked List

struct node
{
            int data;
            struct node *prev;
            struct node *next;
}*start=NULL;

//Prototype Declaration
void createList(int);
void display(void);
void addbeg(int);
void addspec(int,int);
void search(int);
void evenodd(void);

//Main Function Start From Here
void main()
{
            int ch,num,pos;
            clrscr();
            do
            {
                        printf("\n1.Create Linked List");
                        printf("\n2.Display Linked List");
                        printf("\n3.Add At Beginning");
                        printf("\n4.Add At Specific Location");
                        printf("\n5.Search Element in List");
                        printf("\n6.Even Odd Calculations");
                        printf("\n7.Exit");
                        printf("\nEnter Your Choice");
                        scanf("%d",&ch);
                        switch(ch)
                        {
                                    case 1:
                                                printf("Enter any Number");
                                                scanf("%d",&num);
                                                createList(num);
                                                break;
                                    case 2:
                                                display();
                                                break;
                                    case 3:
                                                printf("Enter any Number to add at Beginning");
                                                scanf("%d",&num);
                                                addbeg(num);
                                                break;
                                    case 4:
                                                printf("Enter any Number and its Position");
                                                scanf("%d%d",&num,&pos);
                                                addspec(num,pos);
                                                break;
                                    case 5:
                                                printf("Enter any Number to Search");
                                                scanf("%d",&num);
                                                search(num);
                                                break;
                                    case 6:
                                                evenodd();
                                                break;
                                    case 7:
                                                exit(0);
                                    default:
                                                printf("Invalid Choice");
                        }
            }while(1);
}
//Create Two Way Circular Linked List
void createList(int num)
{
            struct node *q,*temp;
            if(start==NULL)
            {
                        start=(struct node*)malloc(sizeof(struct node));
                        start->data=num;
                        start->prev=start;
                        start->next=start;
            }
            else
            {
                        q=start;

                        //Traverse List Till End
                        while(q->next!=start)
                                    q=q->next;

                        //Add New Node At the End
                        temp=(struct node*)malloc(sizeof(struct node));
                        temp->data=num;
                        temp->next=start;
                        start->prev=temp;
                        q->next=temp;
                        q->next->prev=q;
            }
}

//Display Elements of List
void display(void)
{
            struct node *q=start;
            do
            {
                        printf("%d\t",q->data);
                        q=q->next;
            }while(q!=start);
}

//Add At Beginning in Two Way Circular Linked List
void addbeg(int num)
{
            struct node *q=start,*temp;

            //Traverse List Till End
            while(q->next!=start)
                        q=q->next;

            //Add New Node At Beginning
            temp=(struct node*)malloc(sizeof(struct node));
            temp->data=num;
            temp->next=start;
            q->next=temp;
            start->prev=temp;
            temp->prev=q;
            start=temp;
}

//Add At Specific Position in Two Way Circular Linked List
void addspec(int num,int pos)
{
            struct node *q=start,*temp;
            int i;
            for(i=1;i<pos-1;i++)
                        q=q->next;

            //Add New Node At Specific Position
            temp=(struct node*)malloc(sizeof(struct node));
            temp->data=num;
            temp->next=q->next;
            q->next->prev=temp;
            q->next=temp;
            q->next->prev=q;
}

//Search Element into List
void search(int num)
{
            struct node *q=start;
            int count,i=0,flag=0;
            do
            {
                        if(q->data==num)
                        {
                                    flag=1;
                                    count=i;
                                    break;
                        }
                        i++;
                        q=q->next;
            }while(q!=start);
            if(flag==1)
                        printf("Element Found At Location %d",count+1);
            else
                        printf("No Element Found");
}

//Even Odd Calculation
void evenodd(void)
{
            struct node *q=start;
            int esum=0,osum=0,tsum=0,ec=0,oc=0,tc=0;
            do
            {
                        if(q->data%2==0)
                        {
                                    esum+=q->data;
                                    ec++;
                        }
                        else
                        {
                                    osum+=q->data;
                                    oc++;
                        }
                        tsum+=q->data;
                        tc++;
                        q=q->next;
            }while(q!=start);
            printf("\nEven Sum=%d",esum);
            printf("\nOdd Sum=%d",osum);
            printf("\nTotal Sum=%d",tsum);
            printf("\nEven Count=%d",ec);
            printf("\nOdd Count=%d",oc);
            printf("\nTotal Count=%d",tc);
}
#包括
#包括
//双向循环链表的结构
结构节点
{
int数据;
结构节点*prev;
结构节点*下一步;
}*start=NULL;
//原型声明
无效创建列表(int);
作废显示(作废);
void addbeg(int);
void addspec(int,int);
无效检索(int);
无效偶数(void);
//主要功能从这里开始
void main()
{
int-ch,num,pos;
clrsc();
做
{
printf(“\n1.创建链表”);
printf(“\n2.显示链表”);
printf(“\n3.Add在开头”);
printf(“\n4.在特定位置添加”);
printf(“\n5.Search列表中的元素”);
printf(“\n6.奇偶计算”);
printf(“\n7.Exit”);
printf(“\n输入您的选择”);
scanf(“%d”和“ch”);
开关(ch)
{
案例1:
printf(“输入任何数字”);
scanf(“%d”和&num);
创建列表(num);
打破
案例2:
显示();
打破
案例3:
printf(“在开头输入任何要添加的数字”);
scanf(“%d”和&num);
addbeg(num);
打破
案例4:
printf(“输入任何数字及其位置”);
scanf(“%d%d”,&num,&pos);
addspec(num,pos);
打破
案例5:
printf(“输入任何要搜索的数字”);
scanf(“%d”和&num);
搜索(num);
打破
案例6:
偶数();
打破
案例7:
出口(0);
违约:
printf(“无效选择”);
}
}而(1),;
}
//创建双向循环链表
void createList(int num)
{
结构节点*q,*temp;
if(start==NULL)
{
start=(结构节点*)malloc(sizeof(结构节点));
开始->数据=num;
开始->上一个=开始;
开始->下一步=开始;
}
其他的
{
q=开始;
//遍历列表直至结束
while(q->next!=开始)
q=q->next;
//在末尾添加新节点
temp=(结构节点*)malloc(sizeof(结构节点));
温度->数据=num;
温度->下一步=开始;
开始->上一个=温度;
q->next=温度;
q->next->prev=q;
}
}
//显示列表的元素
作废显示(作废)
{
结构节点*q=开始;
做
{
printf(“%d\t”,q->data);
q=q->next;
}while(q!=开始);
}
//在双向循环链表的开头添加
void addbeg(int num)
{
结构节点*q=start,*temp;