LeetCode-链表1
203. 移除链表元素
方法一:通过哨兵节点作为中间,不断遍历筛选
Java:
public ListNode removeElements(int value) {
//如果为空链表,返回null
if (head == null) return head;
//如果链表不为空,创建哨兵节点
ListNode sentinel = new ListNode(666, head);
head = sentinel;
//遍历节点,直到链表为空时,不存在节点
ListNode p = head;
while (p.next != null){
if (p.next.val == value){
//判断是否为最后一个节点
if (p.next.next != null){
p.next = p.next.next;
} else {
p.next = null;
}
} else {
//从新判断
p = p.next;
}
}
return head.next;
}
C:
struct ListNode* removeElements(struct ListNode* head, int value) {
if (head == NULL) return head;
struct ListNode sentinel;
sentinel.val = 666;
sentinel.next = head;
head = &sentinel;
struct ListNode* p = head;
while (p->next != NULL){
if (p->next->val == value){
if (p->next->next != NULL){
p->next = p->next->next;
} else {
p->next = NULL;
}
} else {
p = p->next;
}
}
return head->next;
}
测试用例
@Test
public void text1(){
RemoveElements removeElements = new RemoveElements();
removeElements.addLast(1);
removeElements.addLast(2);
removeElements.addLast(6);
removeElements.addLast(3);
removeElements.addLast(4);
removeElements.addLast(5);
removeElements.addLast(6);
removeElements.removeElements(6);
for (Integer value:removeElements) {
System.out.println(value);
}
}
方法二:
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
// 已经为null,提前退出
if (head == null) {
return head;
}
// 已确定当前head.val != val
ListNode pre = head;
ListNode cur = head.next;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next; // 删除当前节点
} else {
pre = cur; // 保持pre为当前节点的前一个节点
}
cur = cur.next; // 继续遍历下一个节点
}
return head; // 返回处理完成的链表
}
通过遍历链表,删除值为val
的节点,返回处理结果(链表头节点)。其中,首先在while
循环中,不断移动head
指针,直到找到第一个值不等于val
的节点或链表为空。然后,利用pre
指针和cur
指针配合遍历链表,当遇到值等于val
的节点时,通过修正指针的引用关系进行节点删除操作,否则,继续遍历下一个节点。最后,返回处理完成的链表头节点。