牛客之错题(2016.1.15) && 带头节点与不带头的区别

已知集合A和B的元素分别用不含头结点的单链表存储,函数difference( )用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。

链表结点的结构类型定义如下:

struct node  
{  
int elem;  
node* next;  
};
 
 
void difference(node** LA , node* LB)  
{  
node
*pa , *pb , *pre , *q;  
pre = NULL;

1
//1   
while(pa)  {  
pb = LB;  
   while
2
                 //2
  
   pb = pb->next;                              //做题目有点要首先注意:while的循环、for、if没有加括号!!!
   if
3
                   //3
  
   {  
    if(!pre)  
        *LA =
4
    ;    
//4   
     else  
           
5
= pa->next;    
//5
     q = pa;  
     pa = pa->next;  
     free(q);
 
   }  
    else  {  
           
6
;             //6
  
           pa = pa->next;  
    }  
}  
}

带头节点的链表和不带头结点的链表有何不同:

单链表是一种最为基本的数据结构,常用的单链表又分为带头结点和不带头结点两种。从线性表的定义可以知道,线性表要求允许在任意位置进行插入和删除操作。所有的链表都有一个头指针head, 带头结点的链表中head的数据项为空 。而不带头的直接在头节点存入数据,那么当从头插入数据时,要注意,head是时刻变化的!!!

接下来具体分析。

1.带头节点的链表的插入, 首先使用临时变量p等于要插入之前的节点(不管具体的插入位置) ,之后不管要插入的节点x是插到链表头还是插到链表的其他位置都是如下语句: x->next = p->next;p->next = x;

2.不带头结点的链表的插入, 若要插到链表的开头则

x->next = head->next;
head = x;//这里不再是head->next = x

若插到链表的其他位置则

p = 插入之前的节点
x->next = p->next;
p->next = x;

3.带头结点的链表的删除, 不解释,同样不存在删除位置的差异。

4.不带头结点的链表的删除,删除第一个节点时,head=head->next。删除其他节点时,head的值不会改变。

综上所述,带头节点的单链表,不论删除和插入的位置如何,不需要修改head的值,不带头结点的单链表则需要修改head的值。所以单链表一般为带头结点的单链表

时间: 2024-08-02 11:03:22

牛客之错题(2016.1.15) && 带头节点与不带头的区别的相关文章

C++牛客网上的题(我做的测试了都是对的,它却说是错的,虽然写的很不好,可是每错啊,求大家看看)

输入例子: aabcd 输出例子: a aa aab aabc ab abc b bc bcd c cd d #include <iostream> #include <string.h> using namespace std; void Grial(char *str) { int n = strlen(str); while(*str!='\0') { for(int i = 1;i<=n;i++) { char s[i]; memcpy(s,str,i); *(s+i

牛客网真题练习-01

双核处理 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务.n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间. 输入描述: 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数

牛客网刷题知识汇总2

构造函数不能声明为虚函数,析构函数可以声明为虚函数,且有时候必须声明为虚函数.构造函数和析构函数都不能调用虚函数. 先析构子类再析构父类,如果父类析构函数有虚函数,会导致调用子类的已经析构的内容. 先构造父亲类再构造子类,如果父类构造函数有虚函数,会导致调用子类还没构造的内容. A:构造函数不能声明为虚函数的原因是: 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的.而在构造一个对象时,由于对象还未构造成功.编译器无法知道对象 的实际类型,是该类本身,还是该

牛客网算法题之All-in-All

题目: 有两个字符串s 和t,如果即从s 中删除一些字符,将剩余的字符连接起来,即可获得t.则称t是s 的子序列.请你开发一个程序,判断t是否是s的子序列. 输入描述: 输入包含多组数据,每组数据包含两个字符串s和t. 它们都由数字和字母组成,且长度小于100000. 输出描述: 对应每一组输入,如果t是s的子序列,则输出“Yes”:否则输出“No”. 输入例子: ABC ABCABC ABABC DE 输出例子: YesYesNo 代码: package niuke; import java.

牛客网刷题笔记

1.程序出错在什么阶段__? int main(void) { http://www.taobao.com cout << "welcome to taobao" << endl; } 答案:http相当于一个label,双斜杠之后的www.csdn.net被当做注释了,这段代码是否可以编译通过呢?答案是可以.双斜杠之后的www.csdn.net被当做注释了,那么前面的http:是否合法?这就是C++中一个几乎不会被用到的语法,标签. 参照:http://blo

牛客网刷题知识汇总3

typedef struct {char flag[3];short value;} sampleStruct;union{char flag[3];short value;} sampleUnion; 假设 sizeof(char)=1,sizeof(short)=2,那么sizeof(sampleStruct) = 6 , sizeof(sampleUnion) = 4 结构体 字符型占用1字节,不需要字节对齐 short占用2字节,需要两字节对齐 所以sizeof(sampleStruct

网易2017秋招编程题集合-牛客网

网易2017秋招编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/0147cbd790724bc9ae0b779aaf7c5b50来源:牛客网 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一

网易2017秋招编程题集合_以下代码全部来自牛客网

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列.现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和).现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列. 链接:https://ww

牛客网华为机试训练第3题 明明的随机数

今天花了一下午才把明明的随机数这个搞明白,期间和牛客网的编译器殊死搏斗.一直发现在本地编译器运行成功,但是在牛客上的老师不能通过.整的十分的恼火和焦躁.后来看到了相同的问题,才发现解决之道. 时间限制:1秒 空间限制:32768K 热度指数:222608 本题知识点: 数组 算法知识视频讲解 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不