华三题目链表相关知识
有一个数组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;
}
}