代码随想录算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表。

今天的三道题目都是链表中非常基础的功能,需要着重注意的是链表长度为0时的情况以及要充分考虑是否会越界的情况。

203.移除链表元素

删除链表中等于给定值 val 的所有节点。

力扣题目链接:移除链表元素

class Solution {
public:
	ListNode* removeElements(ListNode* head, int val) {
		ListNode* temp, *ptr;
		while (head != nullptr && head->val == val) {
			temp = head;
			head = head->next;
			delete temp;
		}
		ptr = head;
		while (ptr != nullptr && ptr->next != nullptr) {
			if (ptr->next->val == val) {
				temp = ptr->next;
				ptr->next = ptr->next->next;
				delete temp;
			}
			else {
				ptr = ptr->next;
			}
		}
		return head;
	}
};

707.设计链表

力扣题目链接:设计链表

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
class MyLinkedList {
public:
	class LinkedNode {
	public:
		int val;
		LinkedNode* next;
	};
	LinkedNode* head;
	MyLinkedList() {
		head = nullptr;
	}

	int get(int index) {
		if (head == nullptr) return -1;
		LinkedNode* ptr = head;
		while (index--) {
			if (ptr->next == nullptr) return -1;
			ptr = ptr->next;
		}
		if (ptr == nullptr) return -1;
		return ptr->val;
	}

	void addAtHead(int val) {
		if (head == nullptr) {
			head = new LinkedNode;
			head->val = val;
			head->next = nullptr;
		}
		else {
			LinkedNode* temp = head;
			head = new LinkedNode;
			head->val = val;
			head->next = temp;
		}
	}

	void addAtTail(int val) {
		if (head == nullptr) {
			head = new LinkedNode;
			head->val = val;
			head->next = nullptr;
		}
		else {
			LinkedNode* ptr = head;
			while (ptr->next != nullptr) {
				ptr = ptr->next;
			}
			ptr->next = new LinkedNode;
			ptr->next->val = val;
			ptr->next->next = nullptr;
		}
	}

	void addAtIndex(int index, int val) {
		if (index == 0) {
			addAtHead(val);
		}
		else {
			if (head == nullptr) {
				return;
			}
			LinkedNode* ptr = head;
			while (--index) {
				if (ptr->next == nullptr) return;
				ptr = ptr->next;
			}
			if (ptr->next == nullptr) {
				addAtTail(val);
				return;
			}
			LinkedNode* temp = new LinkedNode;
			temp->val = val;
			temp->next = ptr->next;
			ptr->next = temp;
		}
	}

	void deleteAtIndex(int index) {
		if (index == 0) {
			LinkedNode* temp = head;
			head = head->next;
			delete temp;
		}
		else {
			if (head == nullptr) return;
			LinkedNode* ptr = head;
			while (--index) {
				if (ptr->next == nullptr) return;
				ptr = ptr->next;
			}
			if (ptr->next == nullptr) return;
			LinkedNode* temp = ptr->next;
			ptr->next = ptr->next->next;
			delete temp;
		}
	}
};

本题卡哥的代码使用了一个虚拟头结点,也给链表添加了一个size用来存放链表的大小。

我的代码则没有添加,所以各种情况的判断可能要复杂一些,但是基本功能是成功实现了。

206.反转链表

力扣题目链接:反转链表

反转一个单链表。

这个题目很简单,用双指针法做就可以了,要注意不要越界。

class Solution {
public:
	ListNode* reverseList(ListNode* head) {
		ListNode* pre = nullptr;
		ListNode* cur = head;
		ListNode* tmp;
		while (cur != nullptr) {
			tmp = cur;
			cur = cur->next;
			tmp->next = pre;
			pre = tmp;
		}
		return pre;
	}
};

今天遇到的链表相关的问题还是比较简单的。

你可能感兴趣的:(算法,链表,数据结构)