PIPIOJ—1267: 删除单链表的倒数第K个节点

题目描述

给定一个长度为n的单链表,删除倒数第K的节点,然后从头到尾输出每个节点的值。

输入

第一行包含两个整数N,k,k<=N.
第二行包含N个整数,代表从表头到表尾每个节点的值。
你需要建立单链表把这N个数串起来~

输出

按顺序输出删除了倒数第K个节点后每个节点的值。

样例输入

5 2
1 2 3 4 5

样例输出

1 2 3 5

C++参考解答

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 

typedef int ElemType;

typedef struct LNode {
    ElemType data;
    struct LNode* next;
}LNode,*LinkList;

//尾插法创建单链表
LinkList CreateList(LinkList& L,int N) {
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    LNode* s, *r = L;
    int i = 0,x;
    while (i < N) {
        scanf("%d", &x);
        s = (LinkList)malloc(sizeof(LNode));
        s->data = x;
        s->next = r->next;
        r->next = s;
        r = s;
        i++;
    }
    r->next = NULL;
    return L;
}

//输出单链表
void PrintList(LinkList L) {
    LNode* s = L->next;
    while (s) {
        printf("%d ", s->data);
        s = s->next;
    }
    printf("\n");
}

//按值查找
LinkList GetElem(LinkList L,int i) {
    int j = 1;
    LNode* p = L->next;
    if (i == 0) {
        return  L;
    }
    if (i < 1) {
        return NULL;
    }
    while (p && j < i) {
        p = p->next;
        j++;
    }
    return p;
}

//删除单链表中第i个结点
bool ListDelete(LinkList& L, int i) {
    LNode* p = GetElem(L, i - 1);
    if (p == NULL) {
        return false;
    }
    LNode* q = p->next;
    if (q == NULL) {
        return false;
    }
    p->next = q->next;
    free(q);
    q = NULL;
    return true;
}

int main() {
    int N, k;
    scanf("%d%d", &N, &k);
    int seqloc = N - k+1;
    LinkList L;
    CreateList(L,N);
    ListDelete(L, seqloc);
    PrintList(L);
    return 0;
}

你可能感兴趣的:(数据结构和算法)