203. 移除链表元素 707. 设计链表 206. 反转链表

203. 移除链表元素

题目链接

实现思路

  1. 使用虚拟头节点,循环遍历删除。
  2. 不使用虚拟头节点的情况,需要特判头节点数据匹配的情况,则循环删除。
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 头结点匹配的情况
        while(head!=nullptr && head->val==val)
            head = head->next;
        // 当头节点为空的情况
        if(head==nullptr)
            return head;
        // 其他情况
        ListNode* p = head->next;
        ListNode* q = head;
        while(p!=nullptr)
        {
            if(p->val==val)
                q->next = p->next;
            else
                q = p;
            
            p = p->next;
        }
        return head;
    }
};

707. 设计链表

题目链接

完整代码

class MyLinkedList {
public:
	struct LinkList {
		int val;
		LinkList* next;
		LinkList(int x) :val(x), next(nullptr) {}
	};

	MyLinkedList() {
		head = new LinkList(0);
		head->next = nullptr;
		_size = 0;
	}

	int get(int index) {
		int i = 0;
		// 校验位置合法性
		if (index > _size - 1 || index < 0)
			return -1;
		LinkList* p = head->next;
		// 判表空
		if (p == nullptr)
			return -1;
		while (p != nullptr && i < index)
		{
			p = p->next;
			i++;
		}
		if (p != nullptr)
			return p->val;
		// 找不到的情况
		else
			return -1;
	}

	void addAtHead(int val) {
		// 创建新节点s
		LinkList* s = new LinkList(val);
		s->next = head->next;
		head->next = s;
		// 链表长度加一
		_size++;
		return;
	}

	void addAtTail(int val) {
		// 创建新节点s
		LinkList* s = new LinkList(val);
		LinkList* p = head;
		while (p->next != nullptr)
			p = p->next;
		p->next = s;
		s->next = nullptr;
		// 链表长度加一
		_size++;
		return;
	}

	void addAtIndex(int index, int val) {
		// 校验位置合法性
		if (index > _size)
			return;
		// 找到要插入的位置的前一个节点
		LinkList* p = head;
		int i = 0;
		while (p != nullptr && i < index) {
			p = p->next;
			i++;
		}
		// 插入新节点
		if (p != nullptr) {
			LinkList* newNode = new LinkList(val);
			newNode->next = p->next;
			p->next = newNode;
			_size++;
			return;
		}
		// 在末尾插入新节点
		else {
			addAtTail(val);
			return;
		}
		// 在头部插入新节点
		if (index == 0) {
			addAtHead(val);
			p = head; // 将p指针设置为新的头结点
			return;
		}
	}

	void deleteAtIndex(int index) {
		// 校验位置合法性
		if (index > _size - 1 || index < 0)
			return;

		int i = 0;
		LinkList* p = head->next;
		LinkList* q = head;
		while (p != nullptr && i < index)
		{
			q = p;
			p = p->next;
			i++;
		}
		if (p != nullptr)
		{
			q->next = p->next;
			delete(p);
			_size--;
		}
		return;
	}
private:
	LinkList* head;
	int _size;
};

206. 反转链表

题目链接

实现思路

本题使用就地逆置的方法,原理就是利用头插法。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* p = head; // 当前节点
        ListNode* q; // 前驱节点
        ListNode* dummy_head = new ListNode(); // 虚拟头节点

        while (p != nullptr)
        {
            q = p;
            p = p->next;
            q->next = dummy_head->next;
            dummy_head->next = q;
        }
        return dummy_head->next;
    }
};
posted @ 2022-12-30 20:28  蠢蛋快跑  阅读(64)  评论(0)    收藏  举报