面试题 18:删除链表的结点
题目一:在O(1)时间删除链表结点
题目描述
给定单向链表的一个节点指针,定义一个函数在 O ( 1 ) O(1) O(1) 时间删除该结点。
假设链表一定存在,并且该节点一定不是尾节点。
样例
输入:链表 1->4->6->8
删掉节点:第2个节点即6(头节点为第0个节点)
输出:新链表 1->4->8
思路
将下一个节点的值复制到当前节点,然后将下一个节点删除即可。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void deleteNode(ListNode node) {
ListNode temp = node.next;
node.val = temp.val;
node.next = temp.next;
temp.next = null;
}
}
题目二:删除链表中重复的节点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
思路
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if (pHead == null || pHead.next == null)
return pHead;
ListNode dummy = new ListNode(-1);
dummy.next = pHead;
ListNode prev = dummy, cur = pHead;
while (cur != null) {
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
if (prev.next == cur) {
prev = prev.next;
} else {
prev.next = cur.next;
}
cur = prev.next;
}
return dummy.next;
}
}