难度中等2139收藏分享切换为英文接收动态反馈
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

- public ListNode removeElements(ListNode head, int val) {
- if (head == null) {
- return head;
- }
- // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
- ListNode dummy = new ListNode(-1, head);
- ListNode pre = dummy;
- ListNode cur = head;
- while (cur != null) {
- if (cur.val == val) {
- pre.next = cur.next;
- } else {
- pre = cur;
- }
- cur = cur.next;
- }
- return dummy.next;
- }
什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链接的入口节点称为链表的头结点也就是head。
单链表:
双链表:
每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。
双链表 既可以向前查询也可以向后查询。

循环链表:
循环链表,顾名思义,就是链表首尾相连。循环链表可以用来解决约瑟夫环问题。

链表的存储方式:
数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。
链表是通过指针域的指针链接在内存中各个节点。
所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
删除节点:
只要将C节点的next指针 指向E节点就可以了。

添加节点:

与数组对比:
