简单链表
今天随意看了某人的博客,看到了几道简单的数据结构算法题,来自《剑指offer》,想了下,用c实现:
一、数据结点声明
#include <stdio.h> typedef struct node_type { int data; struct node *next; } node; void insert(node *l, int data) { node *p, *q; p = l; while (p->next) { p = p->next; } q = (node *)malloc(sizeof(node)); q->data = data; q->next = NULL; p->next = q; }
二、问题解答
1、取链表的倒序第k个数
假如有两条相同的链表,第一条先遍历k个数,在第一条链表遍历第k+1数时,第二条链表也开始遍历。
当第一条链表遍历完时,第二条还剩下k个数没有遍历完,那么可得到倒序第k个数据是什么。同理,用
两个指针指向同一个链表,按以上所述,便可得结果。
int get(node *l, int k) { node *p, *q; int i = 0; p = l->next; q = l; while (p) { p = p->next; i++; if (i >= k) { q = q->next; } } if (q == l) return -1; return q->data; }
2、倒序一个单向链表
将链表的每个节点插入链表的开头节点即可。
node *reverse(node *l) { node *p, *q, *head; p = l->next; head = l; head->next = NULL; while(p) { q = p->next; p->next = head->next; head->next = p; p = q; } return head; }
3、用两个栈实现一个队列
数据进队列时,数据放在第一个栈。
数据出队列时,如果第二个栈有数据,先将第二个栈的数据排出,直为空;如果第二个栈为空,那么将第一个栈的数据全部放到第二个栈。
int stack_1[10], cnt_1 = 0; int stack_2[10], cnt_2 = 0; void queue_in(int k) { stack_1[cnt_1++] = k; } int queue_out() { if(cnt_2 > 0){ return stack_2[--cnt_2]; } while(cnt_1 > 0) { stack_2[cnt_2++] = stack_1[--cnt_1]; } if (cnt_2 > 0) { return stack_2[--cnt_2]; } return -1; }