面试整理链表

华三题目链表相关知识

有一个数组a[1000]存放0–1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
以7个数为例
\

-创建结构体,结构体指向下一个
-指定头节点,并且用另外一个指针保存头节点位置
-将0-999数值放进链表里面,并且
-将首尾相互连接起来
-利用链表操作将第三个覆盖第二个,并且跳到第三个位置
代码如下

#include<stdio.h>
#include<stdlib.h>
typedef struct list{
	int info;
	struct list *next;
}Linklist;

int main(){
	
	int cnt,b;

	Linklist *star;
	Linklist *ptr,*clean;

	ptr =(Linklist *)malloc(sizeof(Linklist));
	star = ptr;
	star = clean;
	 
	star -> info=0;
	star -> next = NULL;
	for(int i=1;i<1000;i++){
			star->next=(Linklist *)malloc(sizeof(Linklist));
			star=star->next;
			star->info=i;
			star->next=NULL;
	}
	//形成环状
	star->next=ptr;

	while(ptr!=ptr->next){
		ptr->next->next=ptr->next->next->next;
		ptr=ptr->next->next;
	}
	printf("%d\n",ptr->info);
	//find mar
} 

华三编程题目

在这里插入图片描述


//删除无序链表中的重复节点,仅保留一个,使用2指针定位                           
//考虑到这里需要用到测试框架,这里必须使用二级指针
ListNode* DeleteDuplication(ListNode** pHead){
    if(pHead == NULL || *pHead == NULL)
        return NULL; 
                     
    //指向当前正在处理的节点;
    ListNode* p = *pHead;
    //用于遍历p之后的节点;
    ListNode* q = NULL;
    ListNode* r = NULL;
                     
    while(p != NULL){
        q = p;       
        //若后面有节点与当前节点相同,将其统统删除
        while(q->next != NULL){
            if(q->next->val == p->val){
                //保存需要删掉的节点
                r = q->next;
                //需要删掉的节点的前后节点相接
                q->next = r->next;
                free(r);
                //DestroyListNode(r);
            }        
            else{    
                q = q->next;
            }        
        }            
        p = p->next; 
    }                
                     
    return *pHead;   

链表的增删查改 code

#include<stdio.h>
#include<stdlib.h>
typedef struct list{
	int num;
	int info;
	struct list *next;
}Linklist;
//查找插入

Linklist *find_node(Linklist *head,int num){
	Linklist *mv=NULL;
	for(mv=head;mv!=NULL&&mv->num!=num;mv=mv->next);
	return mv;
}
void inser_node_as_middle(Linklist *head,Linklist *newnode,int num){
	Linklist *fin=find_node(head,num);
	newnode->next=fin->next;
	fin->next=newnode;
}
void insert_node_as_head(Linklist *newnode,Linklist **firaddr){
	newnode->next=*firaddr;
	*firaddr=newnode;
}
void inser_node_as_tail(Linklist *head,Linklist *newnode){

	Linklist *mv=head;
	while(mv->next !=NULL){
		mv=mv->next;
	}
	mv->next=newnode;
	newnode->next=NULL;
}

Linklist *delete_node(Linklist *head,int num){
	
	Linklist *tmp2=head;
	Linklist *tmp,*tmp1;
	//删除头节点
	if(num==head->num){
		free(tmp2);
		return head->next;
	}
	else{
		Linklist *fd=find_node(head,num);
        	while(tmp2!=fd){
                	tmp1=tmp2;
                	tmp2=tmp2->next;
       		}
                tmp1->next=tmp2->next;
                free(tmp2);
                return head;   	
	}
}
int main(){
	
	int cnt=2,b;

	Linklist *star;
	//相当于头节点记住头的位置
	Linklist *ptr;
	Linklist *newnode;

	ptr =(Linklist *)malloc(sizeof(Linklist));
	star = ptr;
	
	 
	star -> info=0;
	star -> num=0;
	star -> next = NULL;
	for(int i=1;i<4;i++){
			star->next=(Linklist *)malloc(sizeof(Linklist));
			star=star->next;
			star->num=i;
			star->info=i;
			star->next=NULL;
	}

	/*
	newnode= (Linklist *)malloc(sizeof(Linklist));
	newnode->info=100;
	newnode->num=10;
	printf("%d\n",(find_node(ptr,cnt))->info);
	*/
	ptr=delete_node(ptr,cnt);
	star=ptr;
	while(star!=NULL){
		printf("%d\n",star->num);
		star=star->next;
		free(ptr);
		ptr=star;
	}
} 

链表递归模式

#include<stdio.h>
#include<stdlib.h>
struct list{
        int info;
        struct list *next;
};

void create_list(struct list *node,struct list *temp);
void display(struct list *node);


void main(){
        /*distrubute memory to struct dynamic memory*/

        struct list *start =(struct list *)malloc(sizeof(struct list));
        //create others node
        create_list(start,NULL);
        //begin with the first node display the information in the struct
        display(start);
}
void create_list(struct list *node,struct list *temp){
        //create temporary node
        //struct list *temp;

        /* keep the information to the sturct*/

        scanf("%d",&node->info);

        /*if the last one make next node NULL*/

        if(node->info ==-9999){
                temp->next =NULL;
        }
        else{
                temp = node;
                node->next =(struct list *)malloc(sizeof(struct list));
                create_list(node->next,temp);
        }
}
void display(struct list *node){
	struct list *ptr;
	ptr=node;
        while(ptr!=NULL){
                printf("%d -> ",ptr->info);
                ptr=ptr->next;
		free(node);
		node=ptr;
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值