【学习点滴-数据结构-单链表】 求单链表的中间元素和倒数第k个元素
来源:互联网 发布:php微信自定义菜单 编辑:程序博客网 时间:2024/05/22 01:30
/* * 算法功能:建立单链表,输出单链表倒数第k个元素(注意链表的倒数第0个是单链表的最后一个元素),输出单链表的中间元素。 * 函数说明: * 1.getKthElem():求出给定单链表的倒数第k个元素。 * 2.getMidElem():求出单链表的中间元素。 * 算法中的单链表是不带头结点的。 * @author:xiaoq-ohmygirl * @time :2012-06-20 **/#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define MAXNODE 5typedef struct linkNode{ int data; linkNode * next;}linkNode,*linkList;int initLinkList(linkList & L,int n){ L = (linkList)malloc(sizeof(linkNode)); if(!L){ return 0; } scanf("%d",&L->data); L->next = NULL; linkList p; for(int i = n-1;i > 0;i--){ p = (linkList)malloc(sizeof(linkNode)); scanf("%d",&p->data); p->next = L->next; L->next = p; } return 1;}linkList reverseLinklist(linkList &L){ if( L == NULL || L->next == NULL){ return L; } linkList node = reverseLinklist(L->next); L->next->next = L; L->next = NULL; return node;}void visit(linkNode * node){ if(node != NULL){ printf("%d->",node->data); }else{ printf("NULL"); } }void getNewLine(){ printf("\n");}//不带头结点的单链表 void traverseLink(linkList L){ linkNode* cur = L; getNewLine(); while(cur != NULL){ visit(cur); cur = cur->next; } getNewLine();}/* * 找出单链表的倒数第k个节点 ,注意倒数第0个元素是单链表的尾指针。 **/ linkList getKthElem(int k,const linkList L){ if(k < 0){ return NULL; } linkList first = L,second = L; while(k--){ if(first->next != NULL){ first = first->next; }else{ return NULL; } } while(first->next != NULL){ first = first->next; second = second->next; } return second; } /* * 取单链表的中间元素,如果单链表元素为奇数个,那么去中间的元素,如果是偶数个,取前面的一个元素。 */ linkList getMidElem(const linkList L){ if(L == NULL){ return NULL; } linkList first = L; linkList second = L; while(first != NULL && first->next != NULL){ first = first->next->next; second = second->next; } return second; } main(){ linkList La = NULL; initLinkList(La,MAXNODE); traverseLink(La); linkList kth; for(int i = 0;i<MAXNODE;i++){ kth = getKthElem(i,La); visit(kth); printf("\n"); } printf("mid: "); linkList mid = getMidElem(La); visit(mid); system("pause"); return 0;}