/*
* 算法功能:建立单链表,输出单链表倒数第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 5
typedef 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;
}
【学习点滴-数据结构-单链表】 求单链表的中间元素和倒数第k个元素
最新推荐文章于 2020-10-20 00:10:54 发布