删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
思路介绍
因为链表访问下一个节点,所以我们可以将要删除的节点赋值給下一节点,将下一节点删除即可
注意事项
题中只给定要删除的节点
代码
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例
输入: 1->1->2
输出: 1->2
思路介绍
保存上一节点
注意事项
代码
public ListNode deleteDuplicates(ListNode head) {
if(head == null)
return head;
ListNode preNode = head;
ListNode currNode = head.next;
while(currNode != null){
if(preNode.val == currNode.val){
preNode.next = currNode.next;
}else{
preNode = currNode;
}
currNode = currNode.next;
}
return head;
}
删除排序链表中的重复元素II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例
输入: 1->1->1->2->3
输出: 2->3
思路介绍
保存上一节点
注意事项
引用头结点,统一操作
代码
public ListNode deleteDuplicates(ListNode head) {
if(head == null)
return null;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode currNode = dummy;
ListNode nextNode = null;
while(currNode.next != null){
nextNode = currNode.next;
int val = nextNode.val;
if(nextNode.next != null && val == nextNode.next.val){
while(nextNode.next != null && nextNode.next.val == val){
nextNode = nextNode.next;
}
currNode.next = nextNode.next;
}else{
currNode = currNode.next;
}
}
return dummy.next;
}
删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路介绍
保存上一节点
注意事项
代码
public ListNode removeNthFromEnd(ListNode head, int n) {
if(n <= 0)
return head;
int len = 0;
ListNode temp = head;
while(temp != null){
len ++;
temp = temp.next;
}
temp = head;
int num = len - n;
if(num <= 0){
head = head.next;
}else{
for(int i=1; i<len-n; i++){
temp = temp.next;
}
temp.next = temp.next.next;
}
return head;
}