单链表输出倒数第k个结点值(栈实现)

思路1:定义两个指针变量p和q,初始时均指向头节点的下一个节点(链表的第一个节点),p指针沿链表移动;
  当p指针移动到第k个节点时,q指针开始与p指针同步移动,
  当p指针移动到最后一个节点时,q指针所指节点就是倒数第k个节点。 思路2:利用栈实现,遍历链表依次入栈,然后出k次栈就找到那个节点了。

  

1.定义栈结构
typedef struct{ int length; int value[50]; }Stack; void push(Stack &s,int v){
   if(s.length <= 50){   s.value[s.length]
= v;   s.length++;   printf("push: v=%d length=%d \n",v,s.length);
  }else{
    printf("exception: out of memory!");
    return;
  } }
void pop(Stack &s,int &v){
  if(s.length > 0){   v
= s.value[--s.length];   printf("pop: v=%d length=%d\n",v,s.length);
  }else{
    printf("exception: out of memory!");
    return;
  } }
void init_Stack(Stack *s){ s->length = 0; }
2.定义单链表结构
typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; void init(LinkList &L){ int i; int d; LinkList p,r; L = (LinkList)malloc(sizeof(LNode)); L->data = -1; L->next = NULL; r = L; scanf("%d",&d); while(d != 65535){ p = (LinkList)malloc(sizeof(LNode)); p->data = d; //p->next = L->next;//头插法 //L->next = p; r->next = p; //尾插法 r = p; scanf("%d",&d); } r->next = NULL;//尾插法不要忘掉这个结束 } void print(LinkList L){ printf("\n"); L = L->next; while(L!=NULL){ printf(" %d ",L->data); L = L->next; } printf("\n"); }
3.实现方法
int
find_munK(LinkList L, int k){ LinkList p ; int i; int result; Stack s; init_Stack(&s); p = L->next; while(p){ push(s,p->data); p = p->next; } for(i=1;i<=k;i++){ pop(s,result); } return result; }
4.测试
int
main(){ LinkList L1; init(L1); print(L1); printf("-->%d\n",find_munK(L1, 3)); //输出倒数第3个 return 0; }

tip:

在上面的方法中:

参数有的是普通类型:

int find_munK(LinkList L, int k)
这里的L是指针类型(因为LinkLinst是指针类型的),
k是普通类型的,进去再出来k不会被修改

有的是地址类型:

 void init(LinkList &L) //这里接收的是一个地址
L是地址类型的,在方法内修改L后,出来L也被修改了
 LinkList L1;//这里的LinkList是指针类型的
 init(L1);
LinkNode L2;//这里的LinkNode是普通类型的
inti(*L2);
 总的来说,就是传入一个地址

有的是指针类型:

void init_Stack(Stack *s)
s是指针类型的,在方法内修改后,出来s也被修改了
Stack s;  //Stack就是普通类型的,和int无差,需要取地址传入指针类型的形参
init_Stack(&s);
void fun(int a,int &b,int &c,int *d,int *e){
    a = 1;
    b = 2;
    c = 3;
    *d = 4;
    *e = 5;
    
}
int main(){
    
 int a = 10;
 int b = 20;
 int * c ;
 int d = 40;
 int * e;
 c = &d;
 e = &b;
 printf("a=%d b=%d c=%d d=%d e=%d \n ",a,b,*c,d,*e);
 fun(a,b,*c,&d,e);
 printf("a=%d b=%d c=%d d=%d e=%d \n ",a,b,*c,d,*e);
 }

 

 

转载于:https://www.cnblogs.com/wwzyy/p/7218932.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值