牛客网剑指offer|中等题day2|JZ76删除链表中的重复节点、JZ23链表中环的入口节点、JZ24 反转链表(简单)

JZ76删除链表中的重复节点

链接:删除链表中重复的结点_牛客题霸_牛客网

  

参考代码:

 自己好像还是偏向双指针这种想法,所以用了两个指针,这样感觉更好理解一些。

对了,去重有两种,我一开始写成了简单的那种,仅仅去重。

这种连重复元素都去掉的更难理解一些。


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead==nullptr || pHead->next==nullptr)
        {
            return pHead;
        }
        ListNode* L=new ListNode(-1);
        L->next=pHead;
        ListNode *pre=L,*slow=L->next,*fast=L->next->next;
        /*
        单纯去重的代码;
         while(fast!=nullptr&& fast->next!=nullptr)
        {
            while(fast!=nullptr  && fast->val==slow->val)
            {
                fast=fast->next;
            }
            slow->next=fast;
            slow=fast;
            if(fast!=nullptr)
            {
              fast=fast->next;
            }
            else {
              break;
            }
            

        }
        return pHead;
        */

        //现在是重复的也要去掉
        while(slow!=nullptr && slow->next!=nullptr)
        {
            if(slow->next->val==slow->val)
            {
                int temp=slow->val;
                while(slow!=nullptr && slow->val==temp)
                {
                    slow=slow->next;
                }
                pre->next=slow;
            }
            else {
               pre=slow;
               slow=slow->next;
            }

        }

       
        return L->next;
       

    }
};

JZ23链表中环的入口节点

链接:链表中环的入口结点_牛客题霸_牛客网

做了好多次了,现在只是条件反射式的会做,但是一时之间公式还是推理不出来。代码随想录链表章节有

这次也还是没写出来。半看了自己之前写的代码,但是思路是正确的。


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode *slow=pHead,*fast=pHead;
        if(fast==nullptr || fast->next==nullptr)
        {
            return nullptr;
        }
        while(fast!=nullptr&& fast->next!=nullptr)
        {
            slow=slow->next;
            fast=fast->next->next;
            if(slow==fast)//代表追寻上了,有环
            {
                ListNode *temp=slow;//相遇节点
                slow=pHead;
                while(temp!=slow)
               {
                   temp=temp->next;
                   slow=slow->next;
               }   
               return temp;

            }
        }
       
        return nullptr;


    }
};

 

JZ24 反转链表

链接:反转链表_牛客题霸_牛客网

5分钟做了出来。

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
		if(pHead==nullptr || pHead->next==nullptr)
		{
			return pHead;
		}
		ListNode *slow=nullptr,*fast=pHead;
		while(fast!=nullptr)
		{
			ListNode *temp=fast;
			fast=fast->next;
			temp->next=slow;
			slow=temp;
		}
		return slow;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值