题目一:查找倒数第K个结点
.已知一个带有表头结点的单链表,结点结构为:
data | link |
假设该链表只给出了头指针list,在不改变链表前提下,请设计一个尽可能高效的算法,查找链表中导数第K个位置上的结点(K为正整数)。若查找成功,算法输出为该节点的data域的值,并返回1,;否则,只返回0.要求:
- 描述算法的基本设计思想;
- 描述算法的详细实现步骤;
- 根据设计思想和实现步骤,采用程序设计语言描述算法,关键之处请给出简要注释。
解答:
- 基本设计思想:定义两个指针p,q,初始时均指向头结点的下一个结点,及链表的头结点。p指针沿着链表移动,当p指向第k个结点时,q指针开始与p指针同步移动,当p指针移动到最后一个节点时,q指针所指示的结点导数第k个结点。以上过程对链表进进行一遍扫描。
- 基本步骤略写。
- 算法实现代码如下:codeblocks12.11+gcc
//查找倒数第K个结点 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *link; }*LinkList; int search_k(LinkList listHead ,int k) { LinkList p = listHead ->link, q = listHead -> link ;//指针平,q指向第一个结点 int count = 0; while(p != NULL) { if(count < k) count ++; else q= q -> link; p = p -> link; } if (count < k) { return 0; } else { printf("%d\n", q->data); return 1; } }
题目二:单链表逆转
题目:已知一个带有头结点的单链表,设计一个高效算法实现该单链表的逆转算法。
解答:
- 算法说明:略
- 算法实现代码:
LinkList linkReverse(LinkList listHead){ if(listHead == NULL || listHead-> link == NULL) { return listHead; /*链表为空,直接返回*/ } LinkList tmp = NULL, pre = NULL, cur = listHead -> link; while(cur != NULL) { tmp = cur-> link; cur-> link = pre; pre = cur; cur = tmp; } listHead ->link = pre; return listHead; }
总的代码:
运行环境codeblocks12.11 +gcc
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *link;
}*LinkList;
/*查找倒数第K个结点*/
int search_k(LinkList listHead ,int k)
{
LinkList p = listHead ->link, q = listHead -> link ;//指针平,q指向第一个结点
int count = 0;
while(p != NULL)
{
if(count < k) count ++;
else q= q -> link;
p = p -> link;
}
if (count < k)
{
return 0;
}
else
{
printf("%d\n", q->data);
return 1;
}
}
/* 链表逆转 */
LinkList linkReverse(LinkList listHead){
if(listHead == NULL || listHead-> link == NULL)
{
return listHead; /*链表为空,直接返回*/
}
LinkList tmp = NULL,
pre = NULL,
cur = listHead -> link;
while(cur != NULL)
{
tmp = cur-> link;
cur-> link = pre;
pre = cur;
cur = tmp;
}
listHead ->link = pre;
return listHead;
}
int main()
{
LinkList listNode[10];
int i =0 ;
for(;i < 10 ;i++){
listNode[i] = (LinkList) malloc( sizeof(struct LNode) );
listNode[i]->data = i;
if (i == 0){
listNode[i] -> link = NULL;
}else{
listNode[i] -> link = listNode[i-1];
}
}
LinkList ListHead = (LinkList) malloc( sizeof(struct LNode) );
ListHead -> link = listNode[9];
LinkList tmp = ListHead -> link ;
while(tmp != NULL){
printf("%d\t", tmp -> data);
tmp = tmp -> link;
}
printf("\n");
linkReverse(ListHead);
tmp = ListHead -> link ;
while(tmp != NULL){
printf("%d\t", tmp -> data);
tmp = tmp -> link;
}
printf("\n");
search_k(ListHead, 1);
return 1;
}