数据结构_单链表

本文源于对《程序员面试宝典》的学习,作者通过一系列面试题深入探讨单链表这一基础数据结构。内容包括单链表的创建、长度计算、打印、查找、删除、插入、排序及逆置等操作,所有示例均基于带头结点的单链表进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看程序员面试宝典,毕竟渣渣要准备找工作了(错了,是不得不找啊!汗~~~),为什么要写一篇单链表呢?一是:当初渣渣根本没有学好;二是:宝典上说链表是一种相对简单的数据结构,容易引起面试官的多次反复发问。好难啊~~~~~


<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就暂且放一放吧!基础没有打好,什么都是空啊~~~~~~~~~~

   


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值