单向链表逆序

 

/**
	单向链表逆序
*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define xprintf printf

#define LL_ADD(node,list) do{	\
	if(list==NULL){				\
		list=node;				\
	}else{						\
		node->next=list;		\
		list=node;				\
	}							\
}while(0)

#define LL_PRINT(list) do{						\
	NODE* header=list;							\
	while(1){									\
		if(header){								\
			xprintf("%d ",header->data);		\
			header=header->next;				\
		}else{									\
			xprintf("\n");						\
			break;								\
		}										\
	}											\
}while(0)

//第一种方式逆序
/***
**
	1、以临时节点指向新表
	2、每从旧表中取出头结点,放入临时节点的后节点
***/
#define LL_REVERSE(list) do{					\
	NODE* temp=(NODE*)malloc(sizeof(NODE));		\
	NODE* next=NULL;							\
	if(list == NULL)							\
		break;									\
	while(list){								\
		next=list->next;						\
		list->next=temp->next;					\
		temp->next=list;						\
		list=next;								\
	}											\
	list=temp->next;							\
	free(temp);									\
}while(0)

//第二种方式逆序
/*
	1、创建新表reverse
	2、每从旧表中取出头结点放入新表头部
	最终得到的就是逆序后的表
*/
#define LL_REVERSE2(list) do{					\
	NODE* reverse=NULL;							\
	NODE* next=list->next;						\
	if(list == NULL)							\
		break;									\
	while(next){								\
		next=list->next;						\
		list->next=reverse;						\
		reverse=list;							\
		list=next;								\
	}											\
	list=reverse;								\
}while(0)
struct _node{
	int data;
	struct _node* next;
};

struct _list{
	int data;
	struct _node* next;
};

typedef struct _node LIST;
typedef struct _node NODE;

int main(){
	LIST* list=NULL;
	int i=0;
	xprintf("add start\n");
	for(i=0;i<10;i++){
		NODE* node=(NODE*)malloc(sizeof(NODE));
		node->data=i;
		node->next=NULL;
		LL_ADD(node,list);
	}
	xprintf("add end\n");
	LL_PRINT(list);  		//原表输出
	LL_REVERSE(list);		//方法一,逆序
	LL_PRINT(list);			//输出方法一逆序后的表
	LL_REVERSE2(list);		//方法二,逆序
	LL_PRINT(list);			//输出方法二逆序后的表,和原表一致
	while(list){
		NODE* header=list;
		list=list->next;
		free(header);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值