链表的节点结构为:
struct ListNode
{
int data;
ListNode * nextNode;
}
顺序查找:
int sequential_search(const List<int> &the_list, const Key &target) /*Post: If an entry in the_list is equal to target, then return the position of this entry. Otherwise return -1 */ { int position; int s=the_list.size(); for(position=0;position<s;position++){ int data; the_list.retrieve(position,data); if(data==target){ return position; } } return -1; }
题目:输入一个单向链表,输出该链表中倒数第k个结点:
我们在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针保持不动;在第k-1步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
实现:
#include "stdafx.h" #include<iostream> #include<queue> using namespace std; typedef struct node{ int data; struct node *next; }Node,*List; List createList(int N) { List head = (List)malloc(sizeof(Node)); head->data = 0; head->next=NULL; int count = 0; List p = head; while(count<N) { count++; List s = (List)malloc(sizeof(Node)); s->data = count; s->next = NULL; p->next = s; p = s; } return head; } void traverse(List head) { if(head == NULL) { return; } List p = head->next; while(p) { cout<<p->data<<" "; p = p->next; } cout<<endl; } List find(List head,int index) { int count = 0; List first = head; List second = NULL; while(first&&count<index)//first首先找到第index个元素 { first = first->next; count++; } //cout<<"count: "<<first->data<<endl; if(first!=NULL)//如果没有到链表尾 { second = head; while(first!=NULL) { first = first->next; second = second->next; } } return second; } int main() { int N = 20; List head = createList(N); traverse(head); List no = find(head,5); if(no!=NULL) { cout<<no->data<<endl; }else{ cout<<"can't find"<<endl; } getchar(); return 0; }