小代码 单链表之反转 然后交错重连+稀疏矩阵

/******
一leetcode题目
 1 2 3 4 n
 1 n-1 2 n-2 3 n-3
 *****/
 #include<iostream>
#include<assert.h>
#include<vector>//容器--类模板
#include<stdlib.h>//利用随机值
#include<time.h>
using namespace std;
  
#define N 1000 
#define K 100
 typedef struct node
{
    int x;
      
    node *next;
public:
    node():x(1) ,next(NULL){}
    node(int a):x(a), next(NULL){}
}node;
int xx[]={0,7,6,5,4,3,2,1,11,12,0};int i=0; 
void  linkcreat(node*head)
{
if(head==NULL)
{
  head=new node;
}
head->x=xx[i++];
while(i<10)
{
node *add=new node(xx[i++]);
add->next=head->next;
head->next=add;
}
}
void show(node *head)
{
node *p=head;
 while(p)
{
cout<<p->x<<" ";
p=p->next;
}
cout<<endl;
} 
  
void V(node *&head) 
{ 
 node *newhead=head;
node *p=head;
node *q=head;
node *t = NULL;
  while(p->next!=NULL)
  {
     q=p;
     p=p->next;
     q->next=t;
     t=q;
    
   }
 head=p;
 p->next=q;
  
}
void V(node *&head,int k)  
{ 
node *newhead=head;
node *p=head;
node *q=head;
node *t = NULL;
  while(k--)
  {
     q=p;
     p=p->next;
     q->next=t;
     t=q;
   }
 
 head=q;
 newhead->next=p;
   
}
 void VV(node *&head)  
 {//快慢指针找到中间结点
     node *p=head;
     node *q=head;
      while(p->next->next!=NULL)
     {
         p=p->next->next;
         q=q->next;
     }
     cout<<q->x<<endl;
 //反转后面的结点
 p=q->next;
node *qq=q->next;
node *t = NULL;
  while(p->next!=NULL)
  {
     qq=p;
     p=p->next;
     qq->next=t;
     t=qq;
   }
  p->next=qq;
 
 q->next=p;
 //从新链接合并
    node *pp=head;
   q->next=NULL;
     while(p->next!=NULL)
{
   t=p;p=p->next;
   t->next=pp->next;
   pp->next=t;
    pp=pp->next->next; 
 }  
  q->next=p;
 }
 
int main()
{
     node *head=new node(1);
      linkcreat(head); 
         show(head);
      VV(head);
 show(head);
}
/**********
#include"wz.h"

template <class T>
struct element
{
  int row, col; //行数、列数
  T item; //元素值
};
const int MaxTerm=100;
template <class T>
class SparseMatrix
{
	public:
		SparseMatrix(){};
		SparseMatrix(int intmu,int intnu,int inttu,element<T> datatemp[]);//有参构造函数,初始化稀疏矩阵
		~SparseMatrix(){}; //析构函数,释放存储空间
		element<T> GetMatrix(int intnumber);//输出下标对应的数组元素
		void Prt();//显示三元组顺序表
		void Trans1(SparseMatrix<T> &B);//直接取、顺序存的矩阵转置算法
		void Trans2(SparseMatrix<T> A, SparseMatrix<T> &B);//顺序取、直接存的矩阵转置算法
	private:
		element<T> data[MaxTerm]; //矩阵非零元素
		int mu, nu, tu;   //行数、列数、非零元个数
};

#endif

template <class T>
SparseMatrix<T>::SparseMatrix(int intmu,int intnu,int inttu,element<T> datatemp[])
{
	if (inttu >MaxTerm ) throw "构造函数的初始化参数不正确";
	mu = intmu;nu = intnu;tu = inttu;
	for(int i=0;i<inttu;i++)
	{
		data[i] = datatemp[i];
	}

}

template <class T>
element<T> SparseMatrix<T>::GetMatrix(int intnumber)
{
	if(intnumber>=tu || intnumber < 0) throw "输入位置不正确";
	return data[i];

}

 
template <class T>
void SparseMatrix<T>::Prt()
{
	 
	for(int i=0;i<tu;i++)
	{
		cout<<data[i].col<<" "<<data[i].row<<" "<<data[i].item<<"\n";
	}

}

 
template <class T>
void SparseMatrix<T>::Trans1(SparseMatrix<T> &B)
{ 
	int pb,pa;
	B.mu=this->nu; B.nu=this->mu; B.tu=this->tu;//设置行数、列数、非零元素个数 

	if (B.tu>0) //有非零元素则转换
	{

		pb = 0;
    for (int col=0; col<this->nu; col++)  //依次考察每一列
			for (pa=0; pa<this->tu; pa++)  //在A中扫描整个三元组表
          if (this->data[pa].col==col ) //处理col列元素
					{  
                B.data[pb].row= this->data[pa].col ;
                B.data[pb].col= this->data[pa].row ;
                B.data[pb].item= this->data[pa].item;
                pb++;
          }

	}  
}

 
template <class T>
void SparseMatrix<T>::Trans2(SparseMatrix<T> A, SparseMatrix<T> &B)
{
	int i,j,k,num[MaxTerm],cpot[MaxTerm];
	B.mu=A.nu;  B.nu=A.mu;  B.tu=A.tu;//设置行数、列数、元素个数
	if (B.tu>0)  //有非零元素则转换
	{
	for (i=0; i<A.nu; i++)    //A中每一列非零元素的个数初始化为0
		num[i]=0;
  for (i=0; i<A.tu; i++)//求矩阵A中每一列非零元素的个数
  {
		j= A.data[i].col;     //取三元组的列号
    num[j]++;
  }  
	cpot[0]=0;     //A中第0列第一个非零元素在B中的位置为0
	for (i=1; i<A.nu; i++)  //求A中每一列第一个非零元素在B中的下标
	cpot[i]= cpot[i-1]+num[i-1];
	for (i=0; i<A.tu; i++)//扫描三元组表A
  {
		j=A.data[i].col;      //当前三元组的列号
    k=cpot[j]; //当前三元组在B中的下标
    B.data[k].row= A.data[i].col ;
    B.data[k].col= A.data[i].row ;
		B.data[k].item= A.data[i].item;
		cpot[j]++;             //预置同一列的下一个三元组的下标
	}  
	}
}
 
int main()
{
	try
	{
		//建立一个element<int>类型的数组(A)
		element<int> elementtemp,elementtemp3,elementtemp2;
		elementtemp.col=0;elementtemp.row = 0 ;elementtemp.item = 15;
		elementtemp2.col=1;elementtemp2.row = 2 ;elementtemp2.item = 16;
		elementtemp3.col=1;elementtemp3.row = 0 ;elementtemp3.item = 17;
		element<int> A[3];A[0] = elementtemp;A[1] = elementtemp2;A[2] = elementtemp3; 

		SparseMatrix<int> sparsematrixB;//构造三元组顺序表来存储转置后的三元组顺序表
		SparseMatrix<int> sparsematrixA(3,3,3,A);//构造三元组顺序表
		cout<<"源三元组顺序表如下:"<<"\n";
		sparsematrixA.Prt();//显示三元组顺序表
		sparsematrixA.Trans1(sparsematrixB);
		cout<<"使用直接取、顺序存转置算法转置后的三元组顺序表如下:"<<"\n";
		sparsematrixB.Prt();//显示三元组顺序表
		sparsematrixA.Trans2(sparsematrixA,sparsematrixB);
		cout<<"使用顺序取、直接存转置算法转置后的三元组顺序表如下:"<<"\n";
		sparsematrixB.Prt();//显示三元组顺序表
	}
	catch(char* e)
	{
		cout<<e;
	}

  return 0;
}
************/
时间: 2025-01-17 18:19:08

小代码 单链表之反转 然后交错重连+稀疏矩阵的相关文章

看图理解单链表的反转

如何把一个单链表进行反转? 方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转. 方法2:使用3个指针遍历单链表,逐个链接点进行反转. 方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾. 方法4:   递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决.但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归.可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决.或者说,因为单

[算法]实现单链表的反转

实现链表的反转 解题思路: 为了正确反转一个链表,需要调整指针的指向.举例说明,例如i,m,n是三个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些结点的next指针都指向前面一个结点.现在遍历到结点m,当然需要调整结点的next指针,让它指向结点i,但需要注意的是,一旦调整了指针的指向,链表就断开了,因为已经没有指针指向结点n,没有办法再遍历到结点n了,所以为了避免指针断开,需要在调整m的next之前要把n保存下来.接下来试着找到反转后链表的头结点.不难分析出翻转后链表的头

秒懂单链表及其反转(reverse)

什么是链表,这种数据结构是由一组Node组成的,这群Node一起表示了一个序列.链表是最普通,最简单的数据结构,它是实现其他数据结构如stack, queue等的基础. 链表比起数组来,更易于插入,删除. Node可以定义如下: typedef int element_type; typedef struct node *node_ptr; struct node { element_type element; node_ptr next; }; 另外关于要不要头节点这个问题,我建议加上头节点,

单链表的反转

如何把一个单链表进行反转? 方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转. 方法2:使用3个指针遍历单链表,逐个链接点交替使用指针改变链表的指向进行反转. 方法3:从第3个节点到第N-1个节点,依次逐节点插入到第1个节点(head节点)之后,再将第N个节点指向head(成环),然后将此时head的下一个节点设为head,最后将原head指向NULL. 方法4:   递归(没搞懂~) 方法2: ActList* ReverseList2(ActList* head) {   //Ac

单链表的反转问题

单链表的反转问题 单链表反转问题经常会遇到.在此记录一下,以便查阅方便. 如果反转一个有头结点的使用下面的方法比较合适. //反转单链表,此单链表带有头节点. //思想:使用tmp临时指针保存头结点与链表的关系 typedef struct ListNode  { int data; struct ListNode * next; }ListNode,*LinkList; void ReverseList(ListNode* Head) { ListNode *current,*tmp; cur

用两种递归思路与循环实现单链表的反转

typedef struct ListNode{ int data; struct ListNode *next; }ListNode; //递归一 ListNode *ReverseList (ListNode *pHead, ListNode *nHead = NULL) { //每次取下第一个节点头插法创建新链表 //nHead为反转后链表的头节点 if(pHead == NULL) return NULL; ListNode *pNext = pHead -> next; pHead -

单链表的反转非递归算法

定义单链表的结点 typedef struct ListNode{ int value; ListNode *next; }ListNode; 我们采用的单链表是带头结点的. 需要遍历一遍链表,在遍历过程中,把遍历的节点一次插入到头部.在这个过程之后,第一个节点成了最后节点,因此要特殊处理,改其后继为NULL. void Inversion(ListNode* head) { if(head->next == NULL) return; //带头结点的单链表,当单链表为空时 if(head->

单链表的反转 python实现实例

单链表反转实现 1.递归实现 根据递归,递归到最后一个节点(条件为head3为非空,其下一个指向为空),将其next指向前一个结点,前一个结点的指向为None. def recurse(head, newhead): # 递归,head为原链表的头结点,newhead为反转后链表的头结点 if head is None: return if head.next is None: newhead = head else: newhead = recurse(head.next, newhead)

线性表总结(单链表的反转)

主要总结单链表反转的几种方法 第一种方法貌似是递归,不太懂,第二种方法使用三个指针逐一完成逆置 结构体定义:class ListNode { int val; ListNode next; ListNode(int x) { //这步没看懂,是结构体里引用了自己吗 val = x; next = null; } } 1 // 1.就地反转法 2 public ListNode reverseList1(ListNode head) { 3 if (head == null) 4 return h