체인 테이블 반전 (귀속과 비귀속 실현)

2195 단어 면접 문제
복습 체인 시계 반전
각각 귀속적인 방법과 비귀속적인 방법으로 실현하다.
체인 테이블 반전 중 보조 파라미터를 빌려 두 개의 바늘로 반전 Node* Reverse2 Point(List* head)를 완성할 수 있다
#include 
#include 

typedef int ElemType;
typedef struct Node {
	int data;
	struct Node* next;
}Node, *List;
// arr ; 
int InitList(List *list, ElemType* arr, int num)
{
	int i= 0;
	Node* tail_node; 
	Node* tmp_node;
	*list =(List)malloc(sizeof(Node));
	if(NULL == *list)
		return;
	(*list)->data = arr[i];
	(*list)->next = NULL;
	tail_node = *list;
	for(i = 1; i < num; i++) {
		tmp_node = (Node*)malloc(sizeof(Node));
		if(NULL == tmp_node)
			return;
		tmp_node->data = arr[i];
	        tmp_node->next = NULL;
		tail_node->next = tmp_node;
		tail_node = tmp_node;	
	}
}	

void TraveseList(List list)
{
	Node* tmp_node;
	if(NULL == list)
		return;
	tmp_node = list;
	while(tmp_node) {
		printf("%d ", tmp_node->data);
		tmp_node = tmp_node->next;
	}
	printf("
"); } void ReverseList(List* list) { Node* p_pre = NULL; Node* p_cur = NULL; Node* p_nxt = NULL; if(NULL == list) return; p_cur = (*list)->next; p_pre = *list; p_pre->next = NULL; while(p_cur) { p_nxt = p_cur->next; p_cur->next = p_pre; p_pre = p_cur; p_cur = p_nxt; } *list = p_pre; } Node* Reverse2Point(List* head) { Node* p_cur = NULL; Node* p_nxt = NULL; if(NULL == *head) return; p_cur = (*head)->next; (*head)->next = NULL; while(p_cur) { p_nxt = p_cur->next; p_cur->next = *head; *head = p_cur; p_cur = p_nxt; } } // , // , ( , -- ) Node* Reverse(Node* p_cur, Node* p_pre) { if(NULL == p_cur->next) { p_cur->next = p_pre; return p_cur; } else { Node *p_nxt = p_cur->next; p_cur->next = p_pre; Reverse(p_nxt, p_cur); } } int main() { List head; Node* tmp; int array[] = {3, 5, 7, 8, 2}; InitList(&head, array, 5); TraveseList(head); printf("reverse list:"); ReverseList(&head); TraveseList(head); printf("reverse list:"); head = Reverse(head, NULL); TraveseList(head); printf("reverse list:"); Reverse2Point(&head); TraveseList(head); return 0; }

좋은 웹페이지 즐겨찾기