单链表的构造和反转

头插法构造单链表(为了存入1->2->3->4->5的链表,需要按照1,5,4,3,2的顺序进行输入,即不考虑头结点的话是逆序的)

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
};
void print(ListNode* head) {
    ListNode* p;
    p = (ListNode*) malloc(sizeof(ListNode));
    p = head;
    while(p!=nullptr) {
    	printf("%d ",p->val);
    	p = p->next;
	}
}
int main() {
	ListNode* head;
	ListNode* end;
	//头插法 
	head = (ListNode*)malloc(sizeof(ListNode));
	head->next = nullptr;
	scanf("%d", &(head->val));
	for(int i = 0; i < 4; i++) {
		ListNode* p;
		p = (ListNode*) malloc(sizeof(ListNode));
		scanf("%d", &(p->val));
		p->next = head->next;
		head->next = p;
	}
	print(head);
}

尾插法构造单链表(为了存入1->2->3->4->5的链表,需要按照1,2,3,4,5的顺序进行输入)

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
};

void print(ListNode* head) {
    ListNode* p;
    p = (ListNode*) malloc(sizeof(ListNode));
    p = head;
    while(p!=nullptr) {
    	printf("%d ",p->val);
    	p = p->next;
	}
}
//尾插法 
	head = (ListNode*)malloc(sizeof(ListNode));
	end = (ListNode*) malloc(sizeof(ListNode));
	scanf("%d", &(head->val)); 
	head->next = nullptr;
	end = head;
	for(int i = 0; i < 4; i++) {
		ListNode* p;
		p = (ListNode*) malloc(sizeof(ListNode));
		scanf("%d", &(p->val));
		end->next = p;
		end = p; 
	} 
	end->next = nullptr;
	print(head);

链表反转

原地反转

	ListNode* do_reverse(stack <int> List) {
        ListNode * head; 
        ListNode* end;
        ListNode* p;
        head = (ListNode*)malloc(sizeof(ListNode));
        end = (ListNode*)malloc(sizeof(ListNode));
        head->val = List.top();
        List.pop();
        head->next = nullptr;
		end = head;
        while(!List.empty()) {
        	 	p = (ListNode*)malloc(sizeof(ListNode));
        	   	p->val = List.top();
        	   	List.pop();
        	   	end->next = p;
        		end = p;
		}
		end->next = nullptr;
		//print(head);
		return head;
    }
    ListNode* reverseList(ListNode* head) {
        stack <int> List;
        ListNode *lNode = head;
        ListNode *NewNode;
        if(lNode == nullptr) 
        return lNode;
        while(lNode != nullptr){
            List.push(lNode->val);
           // printf("%d ",lNode->val);
            lNode = lNode->next;
        }
       NewNode= do_reverse(List);
       return NewNode;
    }

开辟新空间

ListNode* reverseList(ListNode* head) {
    ListNode* pReverseHead = NULL;
    ListNode* pPrev = NULL;
    ListNode* pNode = head;
    ListNode* pNext = head;;
    while(pNext != NULL) { 	
		pNode = pNext;		 		
		pNext = pNode->next;
		if(pNext == NULL) {
			pReverseHead = pNode;
		}		
		pNode->next = pPrev;
		pPrev = pNode;
	}
	return pReverseHead;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值