目录
什么是链表?
声明:节点和结点都描述的是一个东西(大家都这样说的),我真的很容易打错,理解万岁!
链表是一种通过指针串联在一起的线性结构,每一个结点是由两部分组成,一个是数据域,一个是指针域(存放下一个结点的位置),最后一个节点的指针域指向null(空指针的意思)。
这里的A,B等大写字母都是我为了方便书写定义的,真正的表示方式使用十六进制表示的。
链表的入口点称为列表的头结点,也就是head。
链表的类型:
单链表:
刚才描述的就是。
双链表:
双链表每一个结点都有两个指针域,一个指向下一个结点,另一个指向上一个节点。
双链表既可以 向前查询也可以向后查询。
如图:

循环链表:
顾名思义,就是链表首位相连。
循环链表可以用来解决约瑟夫环问题。
链表中怎么删除节点?
下面都是以单链表为例。
力扣上 :移除数组元素
连接:https://leetcode-cn.com/problems/remove-linked-list-elements/
方法一:迭代的思想,设置傀儡节点。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//用迭代 傀儡节点;
ListNode dummyNode=new ListNode();
dummyNode.next=head;
ListNode cur=dummyNode;
while(cur.next!=null){
if(cur.next.val==val){
cur.next=cur.next.next;
}else{
cur=cur.next;
}
}
return dummyNode.next;
}
}
思路:
有了傀儡节点之后就不需要对头结点进行单独考虑了,很方便。
方法二:递归的思路
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//递归的思想;
if(head==null){
return head;
}
head.next=removeElements(head.next,val);
return head.val==val?head.next:head;
}
}
思路:
递归的思路, 首先,安排除了第一个节点以外的节点,看它的值是否等于目标值,如果等于就原地处理,如果不等于就往后走。其次,处理完其它节点后再来看第一个节点的值是否等于目标值,如果等于就把头节点往后 挪,如果不等于就直接返回头结点。
方法三:原链表删除。暴力
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//第三种做法 优先查看头结点,在看其它节点。
while(head!=null && head.val==val){// 删除一个头结点后新的头结点的值可能也是目标值所以用循环来解决。
head=head.next;
}
if(head==null){
return head;
}
ListNode cur=head;
while(cur.next!=null){
if(cur.next.val==val){
cur.next=cur.next.next;
}else{
cur=cur.next;
}
}
return head;
}
}
思路:先处理头节点,在处理其他所有节点。
相似力扣题型推荐:
- 删除链表的节点;
- 设计链表。(强烈推荐真的先把链表学好的童鞋来吧这道题好好做做,真的做会后没提升你来刀我。。。。。。)
本文详细介绍了链表的基本概念及不同类型,包括单链表、双链表和循环链表,并提供了链表中删除节点的三种实现方法及其代码示例。

2472

被折叠的 条评论
为什么被折叠?



