一些简单的链表算法一
链表是很重要的一种数据结构,又是一种看似简单但很难熟练掌握的东西,究其主要原因应该就是它与指针结合的太紧密了。为了让大家更好的学习,特将一些简单的算法罗列如下,大家一起探讨(用c写的而且是不带头结点的)
首先是链表的结构体:
typedef struct node
{
int data;
struct node* next;
}LIST;
1、往链表中压入元素
void Push(LIST **headRef,int newData) { LIST *newNode = new(LIST); newNode->data = newData; newNode->next = *headRef; *headRef = newNode; }
如果我们加入的顺序是1、2、3则得到的链表是{3、2、1}
我们简单构建一个链表{1、2、3}:
LIST* BuildOneTwoThree() { LIST *head = 0; Push(&head,3); Push(&head,2); Push(&head,1); return head; }
2、计算链表的长度
int Length(LIST*head) { LIST *current = head; int length = 0; while(current != 0) { length++; current = current->next; } return length; }
3、计算给定一个元素计算在链表中出现的次数
int Count(LIST*head,int data_to_find) { int count = 0; LIST *current = head; while(current != 0) { if(current->data == data_to_find) count++; current = current->next; } return count; }
4、 给定一个索引取出那个位置的值(索引是从0开始的)
int GetNth(LIST*head,int index) { LIST *current = head; assert(head != 0); assert(index >= 0); for(index; index > 0; index--) { current = current->next; } return current->data; }
5、删除一个链表并释放所有内存将头指针指向NULL
void DeleteList(LIST**headRef) { LIST*current = *headRef; LIST*next = 0; for(current ; current != 0;) { next = current->next; delete(current); current = next; } *headRef = 0; }
6、弹出第一个元素并删除第一个节点
int Pop(LIST**headRef) { int data = 0; assert(*headRef != 0); LIST *current = *headRef; data = (*headRef)->data; *headRef = (*headRef)->next; delete(current); return data; }
7、在给定索引处插入元素
void InsertNth(LIST**headRef,int index,int newData) { if(index == 0) { Push(headRef,newData); } else { LIST*current = *headRef; for(index; index > 1; index--) { assert(current != NULL); current = current->next; } assert(current != 0); Push(¤t->next,newData); } }
上面的都是一些关于链表简单的算法,有些是参考斯坦福大学的讲义而来的,特此说明