算法—— 链表类问题

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法—— 链表类问题相关的知识,希望对你有一定的参考价值。

一、基本操作

1. 三种常见考点

单链表进行排序时,一定用冒泡排序只交换两个节点的data就行了,不用发生指针的移动。

2. 链表类的都需要定义结构体

2)在二叉树中 

这里结合二叉树学习的,再来复习一下结构体的规则:

typedef struct node
	char data;
	struct node *lchild,*rchild;
*BitTree;  //和【int *p】一样,*在指针变量p的前面 
			//同理,node和BitTree尽量不要重名,和【int】与【p】的关系是一样的

3. 创建链表

1)节点

在C++中创建一个节点用new 结构体名()或者new 结构体名。

struct node*head;
head=new node();  //或者head=new node;

在C语言中

struct node *head;
head=(struct node*)malloc(sizeof(node);

这里的“head=”是指向的意思,不要认为此时head就是头结点,它只是头结点的指针,但是它可以操纵头结点。对于其他指针也一样,比如now指针,它并不是当前节点,只是指向当前节点,但是它可以操纵当前节点。

 2)在二叉树中

        复习了链表以后,才理解了创建二叉树时的new node操作—— 创建一个新结点,让结构体指针指向这个新结点

3)尾插法创建链表

struct node *head,*tail,*now;

head=new node(); //创建头结点
head->next=null; // 避免野指针

tail=head; //此时头结点就是尾结点


for(int i=1;i<=一共有多少个;i++)
    now=new node();
    tail->next=now;
    tail=tail->next;
    tail->next=null;


4)头插法

我不喜欢用头插法 

二、例题

2.1 约瑟夫环(猴子报数)

输入
10
2 5
输出
6,1,7,3,10,9,2,5,8,4

# include<bits/stdc++.h>
using namespace std;

struct node
	int num;
	struct node *next;
;

int main()
	int totalMonkey; //猴子总数 
	int start;  //从第几只猴子开始 
	int number;  //报的数
	struct node *head,*tail,*now,*pre;
	/*---------用户输入------------*/
	cin>>totalMonkey;
	cin>>start;
	cin>>number;
	/*----------创建约瑟夫环-------*/ 
	head=new node();  //创建头结点 
	head->num=1;
	head->next=NULL;
	tail=head;
	for(int i=2;i<=totalMonkey;i++) //尾插法创建链表 
		now=new node();
		now->num=i; 
		tail->next=now;
		tail=now;
		tail->next=NULL; 
	
	tail->next=head;//连成一个环
	 
//	/*------约瑟夫环输出测试-------*/
//	for(int i=1;i<=totalMonkey;i++)
//		cout<<head->num<<" ";
//		head=head->next;
//	 

    /*-----------游戏过程---------*/
    //先找到最开始报数的猴子,用now标注
	now=head;
	pre=tail; //pre在now前面一个 
	for(int i=1;i<=start-1;i++)
		now=now->next;
		pre=pre->next;
	 
	while(now->next!=now)
		//报数ing
		for(int i=1;i<=number-1;i++)
			now=now->next;
			pre=pre->next;
		 
		//此时now指向的猴子结点退出
		cout<<now->num<<",";
		pre->next=now->next;
		now->next=NULL;
		now=pre->next; 
	
	cout<<now->num; //最后一只猴子 
    return 0;

 发现自己深入理解一下结点指针和结点的关系后,写起代码来比以前简洁多了!

以上是关于算法—— 链表类问题的主要内容,如果未能解决你的问题,请参考以下文章

链表类常见算法题总结

链表类算法题

20120918-双向链表类定义《数据结构与算法分析》

算法(Algorithms)第4版 练习 链表类 1.3.19~1.3.29

链表类题目总结

数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)