要求:仅遍历链表一次
方法1:利用两个指针
方法2:利用栈的结构特性
方法1:
//输入检测一
//1.没有判断开始的指针为空导致访问空指针访问的内存
//2.开始的链表的的节点个数小于输入的k
//3.输入的k值为0,假如k为无符号的整数,则k-1为0xFFFFFFFF
//输入检测一
//1.没有判断开始的指针为空导致访问空指针访问的内存
//2.开始的链表的的节点个数小于输入的k
//3.输入的k值为0,假如k为无符号的整数,则k-1为0xFFFFFFFF
#include <stdio.h>
#include <time.h>
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALUSE 0
typedef int ELemType;
typedef int Status;
typedef struct Node {
ELemType data;
struct Node * next;
}Node;
typedef struct Node * LinkList;
int CreateNode(LinkList * L , int n){
* L = (LinkList)malloc(sizeof(Node));
if(!(*L))
return ERROR;
(*L)->next = NULL;
int i;
srand(time(0));
LinkList p;
for(i = 0;i<n;i++){
p = (LinkList) malloc(sizeof(Node));
p -> data = random()%100 + 1;
p -> next = (*L)->next;
(*L)-> next = p;
}
return OK;
}
ELemType FindKthFromRail(LinkList L , int k){
if (L == NULL || k == 0) {
return ERROR;
}
LinkList firstLink = L->next;
LinkList secondLink = NULL;
for (unsigned int i =0 ; i<k-1; ++i) {
firstLink = firstLink -> next;
if (firstLink == NULL) {
return ERROR;
}
}
secondLink = L->next;
while (firstLink ->next != NULL) {
firstLink = firstLink ->next;
secondLink = secondLink ->next;
}
return secondLink->data;
}
void TravseNode(LinkList p ){
LinkList r = p -> next;
while (r != NULL) {
printf("%d \n",r->data);
r = r->next;
}
}
int ClearList(LinkList *L){
LinkList p,q;
p=(*L)->next;
while(p){
q=p->next;
free(p);
p=q;
}
(*L)->next = NULL; //头节点的指针域为空
return OK;
}
#include <stdio.h>
#include <time.h>
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALUSE 0
#define MAXSIZE 1000
typedef int Status;
typedef int SElemType;
//使用顺序栈
typedef struct {
SElemType data[MAXSIZE] ;
int top;
}SqStack;
Status InitStack(SqStack * S){
S->top = -1;
return OK;
}
Status Push(SqStack *s , SElemType e){
if (s->top == MAXSIZE -1) {
return ERROR;
}
s->top++;
s->data[s->top] = e;
return OK;
}
Status Pop(SqStack *s , SElemType * t){
if (s->top == -1) {
return ERROR;
}
*t = s->data[s->top];
s->top--;
return OK;
}
void PrintStack(SqStack s){
for (int i=s.top; i> -1; i--) {
printf("%d \n" , s.data[i]);
}
}
int FindKthFromRail(SqStack *s,unsigned n){
if(s == NULL || (*s).top < n-1 || n==0)
return ERROR;
for (int i=0; i < n-1; i++) {
(*s).top--;
}
return (*s).data[(*s).top];
}
int main(){
SqStack s;
InitStack(&s);
//生成n个随机数
srand(time(0));
for (int i=0; i<10; i++) {
Push(&s , rand()%100+1);
}
PrintStack(s);
int value = FindKthFromRail(&s,2);
printf("倒数第3个数是%d\n",value);
return 0;
}
本文介绍了如何在单循环链表中仅遍历一次就找到倒数第n个元素的方法,包括使用两个指针和利用栈的结构特性。特别地,文章提到了方法1中需要注意的输入检测问题,如链表起始指针为空、节点数小于k、k值为0等情况。
5万+

被折叠的 条评论
为什么被折叠?



