链表的基本操作

news/2024/12/21 21:43:44/

链表的基本操作

链表的分类

  1. 单向/双向(引入了 prev 引用)
  2. 带傀儡节点/不带傀儡节点(dummy node)
  3. 带环/不带环

链表的遍历

遍历方式可利用 while 或者 for 循环来进行实现,主要代码块可展示为:

//for循环实现
for(Node cur = head; cur != null; cur = cur.next){....
}
//while循环实现
Node cur = head;
while(cur != null){....cur = cur.next;
}

1.遍历 不带傀儡节点的链表

//遍历 不带傀儡节点的链表public static void print(Node head){for(Node cur = head; cur != null; cur= cur.next){System.out.println(cur.val);}}

2.遍历 带傀儡节点的链表

//遍历 带傀儡节点的链表public static void printWithDummy(Node head){for(Node cur = head.next; cur != null; cur = cur.next){System.out.println(cur.val);}}

链表元素的插入

  • 元素插入链表头部

  • 元素插入链表中部

  • 元素插入链表尾部

    1.插入头部位置和中间位置
    在这里插入图片描述
    2.插入尾部位置

一般情况下尾部插入一个节点的相关代码如下:

//尾插一个节点public static void insertTail(Node head,int val){if(head == null){return;}// 1)找到末尾节点Node prev = head;while(prev != null){prev = prev.next;}//循环结束的时候,cur 就是最后一个节点Node newNode = new Node(val);newNode.next = prev.next;prev.next = newNode;}

当链表本身为空链表时,要实现插入元素,就需要借助 方法的返回值/成员变量 来实现,相关代码如下:

//insertTail方法
public static Node insertTail(Node head,int val){Node newNode = new Node(val);if(head == null){return newNode;}Node prev = head;while(prev.next != null){prev = prev.next;}newNode.next = prev.next;prev.next = newNode;return head;
}//main函数
public static void main(String[] args) {
Node head = null;
head = insertTail(head,val:100);
print(head);
}

链表元素的删除

  • 删除一般节点
  • 删除头节点(需更改 head 的指向)
    1.删除一般节点一般有三种方法:一种是按 待删除节点的值 进行删除;一种是按 待删除节点的位置 进行删除;一种是按 节点下标 进行删除
   //删除节点-按值删除public static void remove1(Node head,int value){// 1)找 val 对应的位置,同时找到 val 前一个位置Node prev = head;while(prev != null&& prev.next != null&& prev.next.val != value){prev = prev.next;}// 2)循环结束,prev 指向待删除的前一个节点if(prev == null || prev.next == null){//未找到值为 val 的节点return;}// 3)删除这个节点 toDelete 指向待删除节点Node toDelete = prev.next;prev.next = toDelete.next;}//删除节点-按位置删除public static void remove2(Node head,Node toDelete){// 1.找到 toDelete 前一个节点Node prev = head;while(prev != null && prev.next != toDelete){prev = prev.next;}if(prev == null){//没找到return;}// 2.进行删除prev.next = toDelete.next;}//按照 节点下标 进行删除public static int size(Node head){int size = 0;for(Node cur = head; cur != null; cur = cur.next){size++;}return size;}public static void remove3(Node head,int index){if(index < 0 || index >= size(head)){return;}if(index == 0){//TODO}// 1.找到待删除节点前一个的位置:即 index-1Node prev = head;for(int i = 0;i < index -1; i++){prev = prev.next;}//循环结束之后,prev 指向待删除节点的前一个位置// 2.进行删除操作Node toDelete = prev.next;prev.next = toDelete.next;}

2.“移花接木”删除节点
不涉及链表的遍历,直接将待删除节点之后的节点复制到待删除节点处
缺点:无法删除最后一个节点

  //“移花接木”删除节点public static void remove4(Node head,Node toDelete){Node nextNode = toDelete.next;toDelete.val = nextNode.val;toDelete.next = nextNode.next;}

http://www.ppmy.cn/news/450699.html

相关文章

链表:常见面试题-拷贝特殊链表

题目&#xff1a; 一种特殊的单链表节点类描述如下: class Node { int value; Node next; Node rand; Node(int val) {value val} } rand指针是单链表节点结构中新增的指针&#xff0c;rand可能指向链表中的任意一个节点&#xff08;包括自己&#xff09;&#xff0c;也可…

盐城市公交路线及时刻表

盐城B支1路公交车运营时间&#xff1a;6:00--20:30 单程票价&#xff1a;1元 途经道路&#xff1a;城西公交回车场-西环路-建军西路-太平路-大庆路-解放路-青年路-亭湖大道-生物工程学校城西公交回车场- 蟒蛇河大桥(北&#xff09; - 市一院 - 泰山庙 - 市房产交易市场 - 太平人…

哈希表--day2--(leetcode242/leetcode383/leetcode49/leetcode438)

文章目录 leetcode242.有效的字母异位词基本思路AC-code leetcode383. 赎金信基本思路AC-code leetcode49.字母异位词分组基本思路AC-code leetcode438.找到字符串中所有字母异位词基本思路AC-code leetcode242.有效的字母异位词 链接 基本思路 思路实际上很简单&#xff0c…

Java三大器小结

filter实例/filter实例/监听器实例过滤和拦截区别/Listener实例/Listener实例

Servlet 三大器

文章目录 脑图 英文博客

大器人生

大器人生 古希腊著名政治家伯利克里任雅典首席官时&#xff0c;由于进行了一系列改革&#xff0c;反对者甚众&#xff0c;有人当面辱骂&#xff0c;但他从不动怒。一天傍晚&#xff0c;一个市民还闯进伯利克里的屋子&#xff0c;一进门就对着他骂个不停。但伯利克里只是静静地坐…

python三大_Python之三大器

一、装饰器 闭包函数 闭&#xff1a;指的是定义在函数内部的函数 比如手机是闭包函数(内层函数)&#xff0c;被手机包装盒 (外层函数) 包裹起来&#xff0c; 手机可以使用包装盒中的东西&#xff0c;内层函数可以引用外层函数的名字。 闭包函数&#xff1a;定义在函数内部的函数…

高频谐振功放大器

高频谐振功率放大器的主要特点是&#xff1a;输出功率足够大、效率高、非线性失真小及频带宽度 影响放大器输出功率的主要因素 功率管本身的集电极最大允许电流、反向击穿电压和最大允许耗散功率 提高放大器输出功率的方法 高频输出功率是高频放大器在输入信号的控制下&#…