剑指offer第七天----- 删除链表中重复的结点

剑指offer第七天----- 删除链表中重复的结点_第1张图片

 

拿到手的主要思路就是设置两个辅助节点,判断当前节点和下一个的值是否一样,一样的就跳过,直到不一样为止。

这是c++版本的,java的就行不通,还是因为对象为空的话那么他的下一个就不能指定。(c++的下)主要针对{1,1}这样的情况。

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode *vhead = new ListNode(-1);
        vhead->next = pHead;
        ListNode *pre = vhead, *cur = pHead;       
        while (cur) {
            if (cur->next && cur->val == cur->next->val) {
                cur = cur->next;
                while (cur->next && cur->val == cur->next->val) {
                    cur = cur->next;
                }
                cur = cur->next;
                pre->next = cur;
            }
            else {
                pre = cur;
                cur = cur->next;
            }
        }
        return vhead->next;
    }
};

用java的话可以选择递归

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        // 递归出口:当「输入节点为空」或者「不存在下一节点」,直接返回
        if (pHead == null || pHead.next == null) return pHead;
 
        if (pHead.val != pHead.next.val) {
            // 若「当前节点」与「下一节点」值不同,则当前节点可以被保留
            pHead.next = deleteDuplication(pHead.next);
            return pHead;
        } else {
            // 若「当前节点」与「下一节点」相同,需要跳过「值相同的连续一段」
            ListNode tmp = pHead;
            while (tmp != null && tmp.val == pHead.val) tmp = tmp.next;
            return deleteDuplication(tmp);
        }
    }
}

但是堆栈就是O(n)的空间复杂度。

i小宋

你可能感兴趣的:(链表,数据结构)