在O(1)时间内删除链表结点&&删除链表中重复节点

题意描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

解题思路:要求在O(1)时间内删除结点,则可以这样考虑:将给定结点后继结点的值赋给给定结点,然后删除给定结点的后继结点即可

void DeleteNode(ListNode** pHead, ListNode* pToBeDeleted) {
	if (!pHead || !pToBeDeleted)
		return;

	if (pToBeDeleted->m_pNext != NULL) {//如果要删除的结点不是尾结点
		ListNode* pNode = pToBeDeleted->m_pNext;
		pToBeDeleted->m_nValue = pNode->m_nValue;
		pToBeDeleted->m_pNext = pNode->m_pNext;

		delete pNode;
		pNode = NULL;
	}
	else if(*pHead == pToBeDeleted){//如果要删除的结点只有一个头结点
		delete pToBeDeleted;
		pToBeDeleted = NULL;
		pHead = NULL;
	}
	else {//链表有多个结点,且删除的是尾结点
		ListNode* p = *pHead;
		while (p->m_pNext != pToBeDeleted)
			p = p->m_pNext;

		p->m_pNext = NULL;
		delete pToBeDeleted;
		pToBeDeleted = NULL;
	}

}

题意描述:删除链表中重复节点

1、重复节点只保留一个

/*
 public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if (pHead == null || pHead.next == null) {
            return pHead;
        }
        ListNode newHead = pHead;
        ListNode curNode = pHead.next;
        while (curNode != null) {
            if(curNode.val == pHead.val) {
                curNode = curNode.next;
                pHead.next = curNode;
            } else {
                pHead = pHead.next;
                curNode = curNode.next;
            }
        }
        return newHead;
    }
}

2、重复节点不保留

/*
 public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if (pHead == null || pHead.next == null) {
            return pHead;
        }
        ListNode newHead = new ListNode(-1);
        newHead.next = pHead;
         
        ListNode last = newHead;
        ListNode cur = pHead;
        while(cur != null && cur.next != null) {
            if(cur.val == cur.next.val) {
                int val = cur.val;
                while (cur != null && cur.val == val) {
                    cur = cur.next;
                }
                last.next = cur;
            } else {
                last = cur;
                cur = cur.next;
            }
        }
        return newHead.next;
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值