删除链表中的节点
题目描述:
237.删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
4->5->1->9
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
问题分析:
利用要删除节点与下一个结点的值的交换,再进行next的变换,完成狸猫换太子的行为,哈哈。
代码展示(已验证):
//237.删除链表中的节点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;//借助值的转换和next指针指向的不同,完成删除这一结点效果
}
}
删除链表的倒数第N个节点 II
题目描述:
leetcode 19.删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
//链表的创建和打印
class ListNode{
int val;
ListNode next;
ListNode(int x)
{
val = x;
};
//在链表的尾部添加新的结点
public void add(int newval){
ListNode newNode = new ListNode(newval);
if(this.next == null)
this.next = newNode;
else
this.next.add(newval);
}
//打印链表
public void print(){
System.out.print(this.val);
if(this.next != null)
{
System.out.print("-->");
this.next.print();
}
}
}
*/
问题分析:
利用三指针,生成一个下一个结点指向head结点的指针current,再生成一个指向head结点的指针fast,
先用fast指针走n步,然后使得另一个指针 slow = current,
和原来的快指针一起移动,当快指针为null时说明慢指针即为要删除的结点
然后通过赋值给他下一个结点然后,使得next的指向越过一位,就能完成删除
return 的时候返回 current.next
创建一个current指针,来带领链表,使用三个指针可以避免因为长度而导致链表
过界的问题
代码展示(已验证):
//leetcode 19.删除链表的倒数第N个节点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head.next == null)
return null;
ListNode fast = head;//定义快指针
//为链表创建一个新的头,return current.next 来带领整个链表
ListNode current = new ListNode(-1);
current.next = head;
ListNode slow = current; //定义慢指针
n = n-1;
while (n>0 && fast.next!=null)//设置快慢指针的初始位置
{
fast = fast.next;
n--;
}
//同时移动,找到要删除的结点
while(fast.next!=null)
{
fast = fast.next;
slow = slow.next;
}
//找到要删除的结点后,进行删除操作,不能越界
slow.next = slow.next.next;
return current.next;
}
}
泡泡:
java中链表的创建和使用
删除排序链表中的重复元素 I
删除排序链表中的重复元素 II
链表这个数据结构,总共两个要义:val,next
设置下一个节点指向头节点的结点
ListNode current = new ListNode(-1);
current.next = head;
返回上述的链表
return current.next;
设置该节点指向头节点
ListNode fast = head;
节点的移动
fast = fast.next;
节点的删除--指针跨越
node.val = node.next.val;
node.next = node.next.next;