【学习点滴-数据结构-单链表】 求单链表的中间元素和倒数第k个元素

/*
 * 算法功能:建立单链表,输出单链表倒数第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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值