庄泽波の博客

好记性不如烂笔头

简单链表

今天随意看了某人的博客,看到了几道简单的数据结构算法题,来自《剑指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;
}

posted on 2014-07-24 00:46  庄泽波  阅读(222)  评论(0编辑  收藏  举报

导航