• 单链表相关笔试题:单链表逆转,约瑟夫环等


    本博文内容:简历单链表,删除节点,输出节点

    逆序输出单链表节点值

    单链表逆转

    输出单链表的倒数k个节点值

    约瑟夫环

    1. 单链表实现,以及相关基本操作

    struct LinkNode
    {
    	int value;
    	LinkNode *next;
    };
    
    void AddToTail(LinkNode **pHead, int value)		//尾插法插入节点
    {
    	LinkNode *pNew = new LinkNode();	//开辟空间用来存储节点值
    	pNew->value = value;
    	pNew->next = NULL;
    	if(*pHead == NULL)
    	{
    		*pHead = pNew;
    	}
    	else
    	{
    		LinkNode *pNode = *pHead;
    		while(pNode->next!=NULL)		//找到最后以后一个节点
    			pNode = pNode->next;
    		pNode->next = pNew;				//插入节点
    	}
    }
    
    void PrintList(LinkNode *pHead)				//输出链表中的节点值
    {
    	LinkNode *pNode = pHead;
    	while(pNode)
    	{
    		cout << pNode->value << " ";
    		pNode = pNode->next;
    	}
    	cout << endl;
    }
    
    void RemoveNode(LinkNode **pHead, int value)		//从链表中删除节点
    {
    	if(pHead==NULL || *pHead==NULL)
    		return;
    	LinkNode *pDeletedNode=NULL;
    	if((*pHead)->value==value)		//头节点
    	{
    		pDeletedNode = *pHead;
    		*pHead = (*pHead)->next;
    	}
    	else
    	{
    		LinkNode *pNode = *pHead;
    		while(pNode->next!=NULL && pNode->next->value!=value)	//找到符合查找值的前一个节点
    			pNode = pNode->next;
    		if(pNode->next!=NULL && pNode->next->value==value)		//找到
    		{
    			pDeletedNode = pNode->next;
    			pNode->next = pNode->next->next;
    		}
    		if(pDeletedNode!=NULL)				//删除节点
    		{
    			delete pDeletedNode;
    			pDeletedNode = NULL;
    		}
    	}
    }
    


    2. 逆序输出单链表的节点值(使用栈)

    void reverse_print(LinkNode *pHead)
    {
    	stack<LinkNode*> s;
    	LinkNode *pNode = pHead;
    	while(pNode)
    	{
    		s.push(pNode);
    		pNode = pNode->next;
    	}
    	while(!s.empty())
    	{
    		pNode = s.top();	
    		cout << pNode->value << " ";
    		s.pop();
    	}
    	cout << endl;
    }
    
    void recur_print(LinkNode *pHead)   //该方法改变了链表原有的结构,且链表长度不能太长
    {
    	if(pHead->next!=NULL)
    		recur_print(pHead->next);
    	cout << pHead->value << " ";
    }
    


    3 单链表逆转

    void reverse_list(LinkNode **pHead)		//逆转单链表
    {
    	LinkNode *cur = *pHead;		//指向当前节点
    	LinkNode *pre= NULL;		//指向前一个节点
    	LinkNode *temp = NULL;		//临时指针
    	while(cur)					//当cur==NULL停止遍历
    	{	
    		temp = pre;
    		pre = cur;
    		cur = cur->next;
    		pre->next = temp;
    	}
    	*pHead = pre;		//将头指针指向最后一个节点
    }
    


    4 约瑟夫环问题(使用循环单链表实现)

    void Joseph(LinkNode **pHead, int k)
    {
    	int cnt=1;
    	LinkNode *pNode = *pHead;
    	LinkNode *tmp = NULL, *dNode = NULL;
    	while(pNode->next!=pNode)  //最后一个节点,则停止
    	{
    		while(cnt!=k)
    		{
    			cnt++;
    			tmp = pNode;
    			pNode = pNode->next;
    		}
    		if(cnt==k)			//第k个节点
    		{
    			dNode = pNode;
    			tmp->next = pNode->next;
    			pNode = pNode->next;
    			cout << dNode->value << " ";
    			delete dNode;		//删除节点
    			dNode = NULL;
    			cnt=1;
    		}
    	}
    	cout << pNode->value << " ";		//输出最后一个节点值
    	cout << endl;
    }
    


    其中循环单链表实现及基本操作如下:

    struct LinkNode
    {
    	int value;
    	LinkNode *next;
    };
    
    //往循环单链表中插入节点
    void AddToTail(LinkNode **pHead, int value)		//尾插法插入节点
    {
    	LinkNode *pNew = new LinkNode();	//开辟空间用来存储节点值
    	pNew->value = value;
    	pNew->next = NULL;
    	if(*pHead == NULL)
    	{
    		*pHead = pNew;
    	}
    	else
    	{
    		LinkNode *pNode = *pHead;
    		while(pNode->next!=*pHead)		//找到最后一个节点
    			pNode = pNode->next;
    		pNode->next = pNew;				//插入节点
    	}
    	pNew->next = *pHead;
    }
    //输出循环单链表中的节点值
    void PrintList(LinkNode *pHead)				//输出链表中的节点值
    {
    	LinkNode *pNode = pHead->next;
    	cout << pHead->value <<" ";		//打印第一个节点值
    	while(pNode!=pHead)
    	{
    		cout << pNode->value << " ";
    		pNode = pNode->next;
    	}
    	cout << endl;
    }
    //删除节点值
    void RemoveNode(LinkNode **pHead, int value)		//从链表中删除节点
    {
    	if(pHead==NULL || *pHead==NULL)
    		return;
    	LinkNode *pDeletedNode=NULL;
    	if((*pHead)->value==value)		//头节点
    	{
    		pDeletedNode = *pHead;
    		*pHead = (*pHead)->next;
    	}
    	else
    	{
    		LinkNode *pNode = *pHead;
    		while(pNode->next!=NULL && pNode->next->value!=value)	//找到符合查找值的前一个节点
    			pNode = pNode->next;
    		if(pNode->next!=NULL && pNode->next->value==value)		//找到
    		{
    			pDeletedNode = pNode->next;
    			pNode->next = pNode->next->next;
    		}
    		if(pDeletedNode!=NULL)				//删除节点
    		{
    			delete pDeletedNode;
    			pDeletedNode = NULL;
    		}
    	}
    }
    


  • 相关阅读:
    VS2015预览版中的C#6.0 新功能(一)
    REST总结
    MVC和传统的以模板为中心的web架构比较
    实现两个select list box间item的移动和过滤
    异步编程
    简述System.Windows.Forms.Timer 与System.Timers.Timer用法区别
    C#导出EXCEL,并生成charts表
    CRC16位校验
    c# 后台GET、POST、PUT、DELETE传输发送json数据
    UDP通讯
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3190357.html
Copyright © 2020-2023  润新知