最近在看程序员面试宝典,毕竟渣渣要准备找工作了(错了,是不得不找啊!汗~~~),为什么要写一篇单链表呢?一是:当初渣渣根本没有学好;二是:宝典上说链表是一种相对简单的数据结构,容易引起面试官的多次反复发问。好难啊~~~~~
<span style="font-size:12px;">typedef struct node
{
int data;
struct node * next;
}Lnode, *LinkList;
ps:
typedef struct
{ error: 不能将 "LinkList" 类型的值分配到 "Lnode *" 类型的实体
int data;
strcut Lnode * next //ps:因为在此处声明了Lnode *对象next,but这个在下行才有
}Lnode, *LinkList;
解决方法:
typedef struct Lnode
{
int data;
struct Lnode * next;
}*LinkList; </span>
ps:下面就通过一些面试题来学习吧!好难啊~~~~~~,以下是集合单链表的建立、测长、打印、查找、删除、插入、排序、逆置结合一体的。以下都是带有头结点的~~~~~
typedef struct node
{
int data;
struct node * next;
}Lnode, *LinkList;
LinkList create_withHead()//尾插法
{
LinkList pHead = NULL;
Lnode * pTemp, * pTail;
int flag;
cin>>flag;
pHead = new Lnode();
while(flag)
{
pTemp = new Lnode();
pTemp->data = flag;
if(! pHead ->next) //头结点处理
pHead->next = pTemp;
else
pTail->next = pTemp;
pTail = pTemp;
cin>>flag;
}
return pHead;
}
int LinkList_Length(LinkList L)
{
int i = 0;
LinkList temp = L;
while(temp->next)//将头结点排除
{
i++;
temp = temp->next;
}
return i;
}
void LinkList_Print(LinkList L)
{
LinkList temp = L;
while(temp->next)
{
cout<<temp->next->data<<endl;
temp = temp->next;
}
}
LinkList LinkList_FindWithValue(LinkList L, int value)
{
LinkList temp = L;
while(temp->next->data != value)
{
temp = temp->next;
}
if(!temp->next)
cout<<"没有该值"<<endl;
else
cout<<"该值为:"<<temp->next->data;
return L;
}
LinkList LinkList_InsertValue(LinkList L,int pos, int value)
{
LinkList temp = L, s;
int i = 0;
while(i < pos)
{
i++;
temp = temp->next;
}
s = new Lnode();
s->data = value;
s->next = temp->next;
temp->next = s;
return L;
}
LinkList LinkList_Delete(LinkList L, int value)
{
LinkList temp= L;
while(temp->next->data != value)
{
temp = temp->next;
}
temp->next = temp->next->next;
return L;
}
LinkList sort(LinkList L)
{
Lnode * temp = L->next;//将头结点排除掉
int value;
//采用冒泡排序的方法
for(int i = 1; i < LinkList_Length(L); i++)
{
temp = L->next;//注意在这里要重新指向第一个节点
for(int j = 0; j < LinkList_Length(L) - i; j++)
{
if((temp->data) > (temp->next->data))
{
//注意为了简单不打乱原来的指针域指向关系,这里采用交换数据域的方法
value = temp->next->data;
temp->next->data = temp->data;
temp->data = value;
}
temp = temp->next;
}
}
return L;
}
//链表的倒置算法
void reverse(LinkList L)
{
Lnode * temp;
Lnode * p = L->next;//带有头结点
L->next = NULL;//将原链表置为空表(ps:因为单链表使用头指针标识的)
while(p)
{
<span style="color:#FF0000;">temp = p;
p = p->next;
temp->next = L->next;
L->next = temp;</span>
}
//该算法在将尾节点调整至第一个节点的同时完成了全部的倒序排列
//所以该算法对链表只顺序扫描一遍就完成了倒置,所以时间复杂度为O(n)
}
ps:面试题1:有一个C语言用来删除单链表的头元素的函数,请找出其中的问题并加以纠正:
void RemoveHead(node * head)
{
free(head); //erro:首先释放了head,就没有head了,下一局就不能正确链接了。
head = head->next;
}
ok:
{
node * p;
p = head->next;
head->next = p->next;
free(p);
}
面试题2: 给出一个单链表,不知道节点N的值,怎样通过遍历一次就可以求出中间节点,写出算法
解析:设立两个指针 *p,*q, p每次移动两个位置即:p = p->next->next; 而q每次移动一个位置即:q = q->next; 当p移动到最后一个节点时,q 则就是中间节点
(尼玛,坑啊~~~~~~)
{
node * temp = head;
while(head->next->next != NULL)
{
head = head->next->next;
temp = temp->next;
mid = temp;
}
}
ps:总算找到一点感觉了,最近这段时间只有恶补数据结构了,cocos就暂且放一放吧!基础没有打好,什么都是空啊~~~~~~~~~~