首页 > 其他分享 >第四节:链表相关(删除倒数第N节点、相邻位置交换)

第四节:链表相关(删除倒数第N节点、相邻位置交换)

时间:2024-03-12 09:16:31浏览次数:30  
标签:dummy ListNode current next 链表 节点 第四节 倒数第

一. 删除倒数第N个节点

一. 题目描述

    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

    示例:

    leetcode地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/

    难度:【中等】

二. 思路分析

     (经典的链表问题,双指针(快慢指针)解决)

    (1).创建虚拟节点dummy, 即它的next指向head第一个节点 【主要为了方便处理边界情况,dummy是头节点head的前一个节点】

    (2).创建快慢双指针,等于dummy

    (3). 让fast快指针先移动n+1步,然后让fast和slow指针同时移动, 直到fast为空  【精髓!】

        此时slow指针恰巧指向被删除节点的前一个节点

    (4). 修改slow指针的指向,达到删除的目的

    (5). 返回头节点,即dummy.next

三. 代码实操


class ListNode {
	val: number;
	next: ListNode | null;
	constructor(val?: number, next?: ListNode | null) {
		this.val = val === undefined ? 0 : val;
		this.next = next === undefined ? null : next;
	}
}

/**
 * 删除链表倒数第N个节点
 * @param head 头节点
 * @param n 需要被删除的倒数第n个节点
 * @returns 返回头节点
 */
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
	//1.创建虚拟节点
	let dummy = new ListNode(-1);
	dummy.next = head;

	//2.创建双指针(快慢指针)
	let fast = dummy;
	let slow = dummy;

	//3.让fast快指针移动n+1步
	for (let i = 0; i <= n; i++) {
		fast = fast.next!;
	}

	//4.让fast和slow指针同时移动,直到fast为空(即超过了最后一个元素)
	while (fast) {
		fast = fast.next!;
		slow = slow.next!;
	}

	//5.此时slow指针恰巧指向被删除节点的前一个节点
	slow.next = slow.next?.next!;

	//6.返回头节点
	return dummy.next;
}

 

 

二. 链表相邻位置两两交换

一. 题目描述

 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 leetcode:https://leetcode.cn/problems/swap-nodes-in-pairs/description/

 难度:【中等】

二. 思路分析

(1). 创建虚拟节点dummy节点,指向head节点

(2). 创建一个current节点,默认指向虚拟节点(这里因为有虚拟节点,所以可以直接调用next)

(3). 遍历节点(接下来两个节点都存在,一直循环)

      A. 取出接下来的两个节点

      B. 交换位置

      C. current赋值,开始下一轮循环

(4).返回头节点

 

三. 代码实操


class ListNode {
	val: number;
	next: ListNode | null;
	constructor(val?: number, next?: ListNode | null) {
		this.val = val === undefined ? 0 : val;
		this.next = next === undefined ? null : next;
	}
}

/**
 * 链表相邻位置的两两交换
 * @param head 头节点
 * @returns  头节点
 */
function swapPairs(head: ListNode | null): ListNode | null {
	// 1. 创建虚拟节点
	let dummy = new ListNode(-1);
	dummy.next = head;

	//2. 创建current节点,指向虚拟节点
	let current = dummy;

	//3. 循环进行两两交换
	while (current.next && current.next.next) {
		let node1 = current.next;
		let node2 = current.next.next;

		//交换node1和node2位置
		current.next = node2;
		node1.next = node2.next;
		node2.next = node1;

		//开始下一次交换
		current = node1;
	}

	return dummy.next;
}

 

 

三. 

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

标签:dummy,ListNode,current,next,链表,节点,第四节,倒数第
From: https://www.cnblogs.com/yaopengfei/p/18067536

相关文章

  • 【算法】【线性表】【链表】合并 K 个升序链表
    1 题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1-......
  • 排序链表(自底向上归并排序)
    题目:时间复杂度:O(nlogn),空间复杂度:O(1)structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(int_val):val(_val),next(nullptr){}ListNode(int_val,ListNode*_next):val(_val),next(_next){}};class......
  • leedcode 反转链表
    自己写的,遍历一遍链表,再反向生成一个新链表classSolution:defreverseList(self,head:Optional[ListNode])->Optional[ListNode]:#检查链表是否为空ifnothead:returnNone#初始化一个空列表,用于存储原始链表节点的值......
  • 判断链表回文
    题目://方法一,空间复杂度O(n)classSolution{public:boolisPalindrome(ListNode*head){vector<int>nums;//放进数组后用双指针判断ListNode*cur=head;while(cur){nums.emplace_back(cur->val);cur=......
  • 探索数据结构:单链表的实战指南
    ✨✨欢迎大家来到贝蒂大讲堂✨✨......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点
    24.两两交换链表中的节点https://leetcode.cn/problems/swap-nodes-in-pairs/description/publicListNodeswapPairs(ListNodehead){if(head==null||head.next==null)returnhead;ListNoderes=head.next;ListNodepre=newListNod......
  • leedcode-移除链表元素
    自己写的:#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defremoveElements(self,head:Optional[ListNode],val):#初始化一个......
  • C 语言整数单链表的表示和实现 数据结构课程设计报告
     数据结构课程设计报告专业名称:计算机科学与技术 课程名称:数据结构        实训题目:整数单链表的表示和实现                           实训环境:C语言实现(DevC++)                    ......
  • 03——链表
    链表经典的链表应用场景:LRU缓存淘汰算法。缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决......
  • 链表
    一、移除链表元素构造虚拟链表,虚拟链表的头节点的指针指向链表头节点 二、设计链表构造函数创建新的链表节点对象 三、反转链表思想:改变指针指向,利用temp指针指向每次断开链表的head位置,和双指针更改指向双指针or递归 四、两两交换相邻节点不改变节点值的情况下考虑......