zoukankan      html  css  js  c++  java
  • 链表面试题(上)

    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("
    ");
    }
    
    //销毁
    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("表空
    ");
    		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("空表
    ");
    		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("
    ");
    }
    
    //从尾到头打印单链表 (递归)
    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("
    ");
    
    }
    
    
    //单链表实现约瑟夫环(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 
    ",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 
    ",SListFindTailKNode(list, 2)->_data);
    }
    

    main.c

    #include"SListNode.h"
    
    int main(){
    //	testAddDel();
    //	testJosephCircle();
    //	testSListReverse();
    //	testSListBubbleSort();
    //	testSListMerge();
    //	testSListFindMidNode();
    	testSListFindTailKNode();
    
    	system("pause");
    	return 0;
    }
  • 相关阅读:
    所谓的小项目
    PHP开发者常犯的10个MySQL错误
    这是掌握cookie最后的一个障碍
    Lua学习笔记(2)——table
    Corona Enterprise 引入第三方 jar 包
    Lua学习笔记(1)
    SQL分页查询笔记
    三两句记录设计模式(1)——简单工厂模式
    Window + Net + Corona + IOS PUSH
    IoC学习
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615374.html
Copyright © 2011-2022 走看看