c++链表实现第一版

#include <iostream>

using namespace std;

struct ListNode {
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {}
	ListNode(int _val) : val(_val), next(nullptr) {}
	ListNode(int _val, ListNode* _next) : val(_val), next(_next) {}
};

class MyLinkedList {
private:
	ListNode* head;
	ListNode* start;
	ListNode* end;
	int size;

public:
    MyLinkedList() {
    	head  = new ListNode(); // 初始化时,head没有指向任何节点,故start,end都指向NULL 
    	start = NULL;
    	end = NULL;
    	size = 0;
    }
    
    int get(int index) {
    	ListNode* p = head;
    	int i=-1; // 由于增加了头节点,故从索引-1开始 
    	if ((index >= size) || (index < 0) ) return -1;
		while(true) {
			if (i != index) {
    			p = p->next;
    			++i;
			} else {
				break;
			}
		}
		return p->val;
    }
    
    void addAtHead(int val) {
    	ListNode* p1 = new ListNode(val);
    	if (size == 0) { // 将第一次加入节点拿出来单独处理 
    		start = p1;
    		end = p1;
    		head->next = p1;
    		++size;
    		return ;
		}
    	p1->next = start;
    	start = p1;
    	head->next = start;
    	++size;
    }
    
    void addAtTail(int val) {
    	ListNode* p2 = new ListNode(val);
    	if (size == 0) { // 将第一次加入节点拿出来单独处理 
    		start = p2;
    		end = p2;
    		head->next = p2;
    		++size;
    		return ;
		}
    	end->next = p2;
    	end = p2;
    	++size;
    }
    
    void addAtIndex(int index, int val) {
    	if (index > size) return ; // 当要插入的点大于size时,不插入节点
		 
    	ListNode* p = head;
    	ListNode* t = new ListNode(val);
    	int i=-1; // 由于增加了头节点,故从索引-1开始 
    	
		if (index <= 0) {
			t->next = head->next;
			head->next = t;
			start = head->next;
			++size;
			return ;
		}
		if (index == size) {
			end->next = t;
			end = t;
			++size;
			return ;
		}

		while(true) { // 找到索引位置 
			if (i > size) {
				return ;
			} else if (i != (index-1)) { // 只找到i位置的前一个就行了。 
    			p = p->next;
    			++i;
			} else { // 找到了索引对应位置的前一个位置 
				break;
			}
		}
		
		t->next = p->next;
		p->next = t;
		++size;
    }
    
    void deleteAtIndex(int index) {
    	if (index >= size) return ;
    	if (index < 0) return ;
    	
    	ListNode* p = head;
    	ListNode* t = NULL;
    	int i=-1; // 由于增加了头节点,故从索引-1开始 
    	
		if (index == 0) { // 如果删除0节点 
			t = head->next;
			head->next = head->next->next;
			start = head->next;
			// delete t; 会报heap-use-after-free错误 
			--size;
			return ;
		}
    	
		while(true) { // 找到索引位置 
			if (i >= size) {
				return ;
			} else if (i != (index-1)) { // 只找到i位置的前一个就行了。 
    			p = p->next;
    			++i;
			} else { // 找到了索引对应位置的前一个位置 
				break;
			}
		}
		if (index == (size-1)) {
			t = p->next;
			p->next = NULL;
			end = p;
			--size;
			return ;
		}	
			
		t = p->next;
		p->next = p->next->next;
		// delete t;
		--size;
    }
    
    void showListTable() {
    	ListNode* p = start;
    	while(true) {
    		if (p->next != NULL) {
    			cout << p->val << "\t";
    			p = p->next;
    			
			} else {
				break;
			}
		}
		cout << p->val << endl;

	}
};

int main() {
	
	MyLinkedList* obj = new MyLinkedList();
	
	obj->addAtHead(5);
	obj->addAtHead(4);
	obj->addAtHead(3);
	

	
	obj->showListTable();
	obj->addAtIndex(3, 0);
	obj->deleteAtIndex(2);
	obj->showListTable();
	
	obj->addAtHead(66);
	obj->showListTable();
	
	obj->addAtTail(6);
	obj->addAtTail(7);
	obj->addAtTail(8);
	obj->showListTable();

	obj->addAtTail(9);
	obj->addAtTail(10);
	obj->addAtTail(11);
	obj->addAtTail(12);
	
	cout << "---test showListTable()--- " << endl;
	obj->showListTable();
	
	cout << "---test get(1)---" << endl;
	cout << obj->get(1) << endl;
	
	cout << "---test addAtIndex(5, 20)---" << endl;
	obj->addAtIndex(5,20);
	obj->showListTable();
	
	cout << "---test deleteAtIndex(2)---" << endl;
	obj->deleteAtIndex(2);
	obj->showListTable();

    return 0;
}

 结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值