Beschreibung des Problems:
Verwenden Sie eine einfach verknüpfte Liste, um eine Ganzzahlfolge darzustellen. Implementieren Sie bitte einen Algorithmus mit einer Zeitkomplexität von O(n) und einer Raumkomplexität von O(1) und bestimmen Sie den k-ten Knoten vom letzten in die einfach verknüpfte Liste durch einen Durchlauf.
Programmieranforderungen:
Geben Sie
mehrere Datensätze ein, jeder Datensatz hat drei Zeilen, die erste Zeile ist die Länge n der verknüpften Liste, die zweite Zeile sind n Elemente der verknüpften Liste (getrennt durch Leerzeichen zwischen den Elementen) und die dritte Zeile ist k. Die Eingabe endet, wenn n=0.
Ausgabe:
Geben Sie eine Zeile für jeden Datensatz aus und geben Sie den Wert aus, der dem k-ten Knoten vom letzten jeder verknüpften Liste entspricht.
C-Version:
#include<stdio.h>
#include<stdlib.h>
//定义链表
typedef struct Node {
int val;
struct Node* next;
}node, * list;
list initlist() {
node* l = (node*)malloc(sizeof(node));
l->next = NULL;
l->val = -1;
return l;
}
list creat(int len) {
node* head = initlist();
// printf("%d ",head->val );
node* p = head;
// printf("%d ",p->val );
for (int i = 0; i < len; i++) {
node* s = (node*)malloc(sizeof(node));
scanf("%d", &s->val);
s->next = NULL;
p->next = s;
p = s;
}
return head;
}
void locate(node* A,int k) {
node* s = A->next;
node* p = A->next;
for(int i=0;i<k;i++){
p=p->next;
}
while(p!=NULL){
p=p->next;
s=s->next;
}
//return s;
A->next=s;
}
int main() {
int m = 0;
int count = 0;
int k = 0;
node** a = (node**)malloc(sizeof(node*) * 100);
int max[100]={0};
scanf("%d", &m);
for (int i = 0; m != 0; i++) {
a[i] = creat(m);
scanf("%d", &k);
locate(a[i],k);
count++;
scanf("%d", &m);
}
for (int i = 0; i <count; i++) {
node* s = a[i]->next;
printf("%d", s->val);
printf("\n");
}
}
C++-Version:
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
void CreateList_R(LinkList& L, int n)
{//后插法创建单链表
int x = 0;
LNode* p = L;
LNode* a;
while (n != 0) {
a = new LNode;
cin >> x;
a->data = x;
p->next=a;
p = p->next;
n--;
}
p->next = NULL;
}
void Search_k(LinkList L, int k)
{
LNode* p = L->next;
LNode* c = L->next;
int index = 0;
while (index != k) {
p = p->next;
index++;
}
while (p != NULL) {
p = p->next;
c = c->next;
}
if (c != NULL) {
cout << c->data << endl;
}
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0) break;
LinkList L =new LNode;
L->next=NULL;
CreateList_R(L, n);
int k;
cin >> k;
Search_k(L, k);
}
return 0;
}