当前位置: 面试刷题>> 无序链表的重复项删除 (经典算法题500道)


题目描述补充

题目:无序链表的重复项删除

给定一个单链表的头节点 head,链表中包含整数类型的节点值,且链表中节点的值可能重复。请编写一个函数,删除链表中所有重复的元素,使得每个元素只出现一次,并返回修改后的链表的头节点。

注意:

  1. 链表中的节点定义可能如下(以Python为例,其他语言类似):
    class ListNode:
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
    
  2. 题目要求修改链表本身,而不是返回一个新的链表。
  3. 假设链表中至少包含一个节点,且节点的值在 [-1000, 1000] 的范围内。

Python 代码示例

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def deleteDuplicates(head):
    if not head or not head.next:
        return head
    
    current = head
    while current and current.next:
        if current.val == current.next.val:
            # 发现重复,删除重复节点
            current.next = current.next.next
        else:
            current = current.next
    return head

# 示例使用
# 创建链表 1->2->3->3->4->4->5
node5 = ListNode(5)
node4 = ListNode(4, node5)
node4_dup = ListNode(4, node4)
node3 = ListNode(3, node4_dup)
node3_dup = ListNode(3, node3)
node2 = ListNode(2, node3_dup)
node1 = ListNode(1, node2)

# 删除重复项
result_head = deleteDuplicates(node1)

# 辅助函数打印链表
def printList(node):
    while node:
        print(node.val, end=" ")
        node = node.next
    print()

printList(result_head)  # 输出应为 1 2 3 4 5

PHP 代码示例

class ListNode {
    public $val;
    public $next;
    
    function __construct($val = 0, $next = null) {
        $this->val = $val;
        $this->next = $next;
    }
}

function deleteDuplicates($head) {
    if (!$head || !$head->next) {
        return $head;
    }
    
    $current = $head;
    while ($current && $current->next) {
        if ($current->val == $current->next->val) {
            $current->next = $current->next->next;
        } else {
            $current = $current->next;
        }
    }
    
    return $head;
}

// 示例使用
// 假设已经通过某种方式创建了链表
// ...

// 删除重复项并打印结果(这里省略链表创建的代码)

JavaScript 代码示例

class ListNode {
    constructor(val = 0, next = null) {
        this.val = val;
        this.next = next;
    }
}

function deleteDuplicates(head) {
    if (!head || !head.next) {
        return head;
    }
    
    let current = head;
    while (current && current.next) {
        if (current.val === current.next.val) {
            current.next = current.next.next;
        } else {
            current = current.next;
        }
    }
    
    return head;
}

// 示例使用
// 创建链表 1->2->3->3->4->4->5
let node5 = new ListNode(5);
let node4 = new ListNode(4, node5);
let node4_dup = new ListNode(4, node4);
let node3 = new ListNode(3, node4_dup);
let node3_dup = new ListNode(3, node3);
let node2 = new ListNode(2, node3_dup);
let node1 = new ListNode(1, node2);

// 删除重复项
let resultHead = deleteDuplicates(node1);

// 辅助函数打印链表
function printList(node) {
    let result = '';
    while (node) {
        result += `${node.val} `;
        node = node.next;
    }
    console.log(result.trim());
}

printList(resultHead);  // 输出应为 1 2 3 4 5

码小课网站中有更多相关内容分享给大家学习,包括链表操作、算法进阶等丰富资源。

推荐面试题