链表面试题(上)

SListNode.h

 

#ifndef _SLISTNODE_H_
#define _SLISTNODE_H_
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<malloc.h>
#include<windows.h>

typedef int DataType;

typedef struct SListNode 
{ 
	struct SListNode* _next; 
	DataType _data; 
}SListNode;

SListNode* Init();
SListNode* BuySListNode(DataType x); 
void SListPrint(SListNode* pHead); 
void SListDestory(SListNode** ppHead); 

void SListPushBack(SListNode** ppHead, DataType x); 
void SListPopBack(SListNode** ppHead); 
void SListPushFront(SListNode** ppHead, DataType x); 
void SListPopFront(SListNode** ppHead); 
SListNode* SListFind(SListNode* pHead, DataType x); 
void SListInsert(SListNode** ppHead, SListNode* pos, DataType x); 
void SListErase(SListNode** ppHead, SListNode* pos); 

//test*************
void test1();
void test2();
void test3();
void testAddDel();
void testJosephCircle();
void testSListReverse();
void testSListBubbleSort();
void testSListMerge();
void testSListFindMidNode();
void testSListFindTailKNode();
//********************

//链表面试题
void SLitsPrintTailToHead(SListNode* pHead) ;
void SListPrintTailToHeadR(SListNode* pHead) ;

void SListDelNonTailNode(SListNode* pos) ;
void SListInsertFrontNode(SListNode* pos, DataType x) ;
SListNode* SListJosephCircle(SListNode* pHead, int k) ;
SListNode* SListReverse(SListNode* list) ;
void SListBubbleSort(SListNode* list) ;
// 升序 
SListNode* SListMerge(SListNode* list1, SListNode* list2) ;
SListNode* SListFindMidNode(SListNode* list) ;
SListNode* SListFindTailKNode(SListNode* list, size_t k) ;

#endif

SListNode.c

#include"SListNode.h"

//初始化
SListNode* Init(){
	SListNode* head = (SListNode *)malloc(sizeof(SListNode));
	head->_next=NULL;
	return head;
}

//创建一个结点
SListNode* BuySListNode(DataType x){
	SListNode *node = (SListNode *)malloc(sizeof(SListNode));
	node->_data=x;
	node->_next=NULL;
	return node;
}

//打印单链表
void SListPrint(SListNode* pHead){

	SListNode* cur;
	assert(pHead);
	cur = pHead->_next;
	while(cur){
		printf("%d ",cur->_data);
		cur=cur->_next;
	}
	printf("\n");
}

//销毁
void SListDestory(SListNode** ppHead){
	SListNode *cur,*t;
	assert(ppHead);
	cur = *ppHead;
	while(cur){
		t = cur->_next;
		free(cur);
		cur = t;
	}
}

//尾插;
void SListPushBack(SListNode **ppHead, DataType x){
	
	SListNode *newNode = BuySListNode(x);
	SListNode *cur;
	assert(ppHead);
	cur=*ppHead;
	while(cur->_next){
		cur=cur->_next;
	}
	cur->_next=newNode;
}

//尾出
void SListPopBack(SListNode** ppHead){
	SListNode *cur,*pr;
	if((*ppHead)->_next==NULL){
		printf("表空\n");
		return;
	}
	pr=cur=*ppHead;
	assert(ppHead);
	while(cur->_next){
		pr = cur;
		cur=cur->_next;
	}
	free(cur);
	pr->_next=NULL;
}
//头入
void SListPushFront(SListNode** ppHead, DataType x){
	SListNode *head,*newNode;
	assert(ppHead);
	head = *ppHead;
	newNode = BuySListNode(x);
	newNode->_next = head->_next;
	head->_next=newNode;

}
//头出
void SListPopFront(SListNode** ppHead){
	SListNode *head,*temp;
	assert(ppHead);
	if((*ppHead)->_next==NULL){
		printf("空表\n");
		return;
	}

	temp = head = *ppHead;
	temp = temp->_next;
	head->_next = temp->_next;
	free(temp);
}
//查找值为x的节点
SListNode* SListFind(SListNode* pHead, DataType x){
	SListNode* cur;
	assert(pHead);
	cur = pHead;
	while(cur){
		if(cur->_data==x){
			return cur;
		}
		cur = cur->_next;
	}
	return NULL;
}
//在pos节点前插入一个值为x的节点
void SListInsert(SListNode** ppHead, SListNode* pos, DataType x){
	SListNode *cur,*pr,*newNode;
	newNode = BuySListNode(x);
	assert(ppHead);
	assert(pos);
	pr = cur = *ppHead;
	while(cur&&cur!=pos){
		pr = cur;
		cur = cur->_next;
	}
	if(cur){
		newNode->_next = cur;
		pr->_next = newNode;
	}
}
//删除指定节点
void SListErase(SListNode** ppHead, SListNode* pos){
	SListNode *cur,*pr;
	assert(ppHead);
	assert(pos);
	pr = cur = *ppHead;
	while(cur&&cur!=pos){
		pr = cur;
		cur = cur->_next;
	}
	pr->_next = cur->_next;
	free(cur);
}

viewtest.c

 

 

#include"SListNode.h"

//从尾到头打印单链表 (非递归)
void SLitsPrintTailToHead(SListNode* pHead){
	SListNode *cur,*tail;
	assert(pHead);
	cur = pHead;
	tail = (SListNode*)malloc(sizeof(SListNode));
	tail = NULL;
	while(tail != pHead->_next){
		cur = pHead;
		while(cur->_next!=tail){
			cur=cur->_next;
		}
		printf("%d ",cur->_data);
		tail = cur;
	}
	printf("\n");
}

//从尾到头打印单链表 (递归)
void SListPrintTailToHeadR(SListNode* pHead){
	if(pHead==NULL)
		return;
	SListPrintTailToHeadR((pHead)->_next);
	printf("%d ",(pHead)->_data);
}

//删除一个无头单链表的非尾节点(不能遍历链表) 
void SListDelNonTailNode(SListNode* pos) {
	SListNode *cur;
	assert(pos&&pos->_next);
	cur=pos->_next;
	pos->_data = cur->_data;
	pos->_next = cur->_next;
	free(cur);
	cur = NULL;
}

//在无头单链表的一个节点前插入一个节点(不能遍历链表) 
void SListInsertFrontNode(SListNode* pos, DataType x){
	SListNode *newNode;
	assert(pos);
	newNode = BuySListNode(pos->_data);
	newNode->_next = pos->_next;
	pos->_next = newNode;
	pos->_data = x;
}

//打印环形链表
void printCList(SListNode* phead){
	SListNode* cur = phead;
	cur = cur->_next;
	printf("%d ",phead->_data);
	while(cur!=phead){
		printf("%d ",cur->_data);
		cur = cur->_next;
	}
	printf("\n");

}


//单链表实现约瑟夫环(JosephCircle) 
SListNode* SListJosephCircle(SListNode* pHead, int k) {
	int i, j, flag=1;
	SListNode *cur, *k_cur;
	assert(pHead);
	cur = pHead;
	while(cur->_next){
		cur = cur->_next;
	}
	cur->_next = pHead->_next; //链接为环
	cur = cur->_next;
	i = k;
	j = 1;

	while(cur!=cur->_next){
		j++;
		if(j==k){
			k_cur = cur->_next;
			cur->_next = k_cur->_next;
			free(k_cur);
			k_cur = NULL;
			j = 1;
			printCList(cur);
		}
		cur = cur->_next;
	}
	return cur;
}

//逆置/反转单链表 
SListNode* SListReverse(SListNode* list) {
	SListNode *cur, *tail=NULL;
	DataType tmp;
	assert(list);
	cur = list->_next;
	while(list->_next!=tail){
		cur = list->_next;
		while(cur->_next!=tail){
			tmp = cur->_data;
			cur->_data=cur->_next->_data;
			cur->_next->_data=tmp;
			cur = cur->_next;
		}
		tail =cur;
	}
	return list;
}

//单链表排序(冒泡排序&快速排序) 
void SListBubbleSort(SListNode* list){
	int flag;
	SListNode *cur, *tail = NULL;
	DataType tmp;
	assert(list);
	cur = list->_next;
	while(list->_next!=tail){
		flag = 0;
		cur = list->_next;
		while(cur->_next!=tail){
			if(cur->_data>cur->_next->_data){
				tmp = cur->_data;
				cur->_data = cur->_next->_data;
				cur->_next->_data = tmp;
				flag = 1;
			}
			cur = cur->_next;
		}
		if(flag==0)
			return ;
		tail = cur;
	}
}

//void quicksort(SListNode* list){
//
//}


// 并归升序 
SListNode* SListMerge(SListNode* list1, SListNode* list2){
	SListNode* cur1=list1->_next, *cur2=list2->_next;
	SListNode* newList = Init();
	assert(list1&&list2);
	while(cur1&&cur2){
		if(cur1->_data>cur2->_data){
			SListPushBack(&newList,cur2->_data);
			cur2=cur2->_next;
		}
		else{
			SListPushBack(&newList,cur1->_data);
			cur1=cur1->_next;
		}
	}
	while(cur1){
		SListPushBack(&newList,cur1->_data);
		cur1=cur1->_next;
	}
	while(cur2){
		SListPushBack(&newList,cur2->_data);
		cur2=cur2->_next;
	}
	return newList;
}

//找到中间结点
SListNode* SListFindMidNode(SListNode* list) {
	SListNode *fastnode=list->_next;
	SListNode *slownode=list->_next;
	assert(list);
	while(fastnode&&fastnode->_next){
		fastnode = fastnode->_next->_next;
		slownode = slownode->_next;
	}
	return slownode;
}
//找到倒数第k个结点
SListNode* SListFindTailKNode(SListNode* list, size_t k){
	SListNode* fast = list->_next;
	SListNode* slow = list->_next;
	assert(list);
	while(fast&&k--)
		fast=fast->_next;
	while(fast){
		fast=fast->_next;
		slow=slow->_next;
	}
	return slow;
}

//从尾到头打印单链表
void test3(){
	SListNode *list=Init();
	SListPushBack(&list,1);
	SListPushBack(&list,2);
	SListPushBack(&list,3);
	SListPushBack(&list,4);
	SListPushBack(&list,5);
	SListPrint(list);
	SLitsPrintTailToHead(list);
	SListPrintTailToHeadR(list->_next);
}	

//无头节点的增加删除
void testAddDel(){
	SListNode *node;
	SListNode *list=Init();
	SListPushBack(&list,1);
	SListPushBack(&list,2);
	SListPushBack(&list,3);
	SListPushBack(&list,4);
	SListPushBack(&list,5);
	SListPrint(list);
	node = SListFind(list,3);
	SListInsertFrontNode(node,6);	//在3的节点前插入6
	SListPrint(list);
	node = SListFind(list,4);		//删除节点为4的节点
	SListDelNonTailNode(node);
	SListPrint(list);
}

//测试约瑟夫环
void testJosephCircle(){
	SListNode *list=Init();
	SListPushBack(&list,1);
	SListPushBack(&list,2);
	SListPushBack(&list,3);
	SListPushBack(&list,4);
	SListPushBack(&list,5);
	SListPushBack(&list,6);
	SListPushBack(&list,7);
	SListPushBack(&list,8);
	SListPushBack(&list,9);
	SListPushBack(&list,0);
	SListPrint(list);
	SListJosephCircle(list,3);
}

//测试单链表逆置
void testSListReverse(){
	SListNode *list=Init();
	SListPushBack(&list,1);
	SListPushBack(&list,2);
	SListPushBack(&list,3);
	SListPushBack(&list,4);
	SListPushBack(&list,5);
	SListPushBack(&list,6);
	SListPrint(list);
	list = SListReverse(list);
	SListPrint(list);
}

void testSListBubbleSort(){
	SListNode *list=Init();
	SListPushBack(&list,5);
	SListPushBack(&list,2);
	SListPushBack(&list,1);
	SListPushBack(&list,7);
	SListPushBack(&list,4);
	SListPushBack(&list,6);
	SListPrint(list);
	SListBubbleSort(list);
	SListPrint(list);
}


void testSListMerge(){
	SListNode *list1=Init();
	SListNode *list2=Init();
	SListNode *list=Init();
	SListPushBack(&list1,1);
	SListPushBack(&list1,3);
	SListPushBack(&list1,7);
	SListPushBack(&list1,8);
	SListPushBack(&list1,9);
	SListPushBack(&list2,2);
	SListPushBack(&list2,3);
	SListPushBack(&list2,6);
	list=SListMerge(list1,list2);
	SListPrint(list);
}

void testSListFindMidNode(){
	SListNode *list=Init();
	SListPushBack(&list,1);
	SListPushBack(&list,2);
	SListPushBack(&list,3);
	SListPushBack(&list,4);
	SListPushBack(&list,5);
	SListPushBack(&list,6);
	SListPushBack(&list,7);
	SListPrint(list);
	printf("%d \n",SListFindMidNode(list)->_data);
}

void testSListFindTailKNode(){
	SListNode *list=Init();
	SListPushBack(&list,1);
	SListPushBack(&list,2);
	SListPushBack(&list,3);
	SListPushBack(&list,4);
	SListPushBack(&list,5);
	SListPushBack(&list,6);
	SListPushBack(&list,7);
	SListPrint(list);
	printf("%d \n",SListFindTailKNode(list, 2)->_data);
}

main.c

 

 

#include"SListNode.h"

int main(){
//	testAddDel();
//	testJosephCircle();
//	testSListReverse();
//	testSListBubbleSort();
//	testSListMerge();
//	testSListFindMidNode();
	testSListFindTailKNode();

	system("pause");
	return 0;
}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Victor.Chang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值