当前位置: 首页 > news >正文

大埔建设工程交易中心网站北京seo全网营销

大埔建设工程交易中心网站,北京seo全网营销,怎么样做网站卖农产品,齐河网站建设24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 输入:head [1,2,3,4] 输出&#xff1a…

24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 

输入:head = [1,2,3,4]
输出:[2,1,4,3]

 此题说明了只能进行节点交换。其实按要求改变结点走向就行了

        

 设置一个虚拟头结点cur

        1、每次cur->next = cur->next->next; 就完成了步骤一

        2、对于步骤二,其实只需要先把要指向的结点保存一下,然后再改指向。

                ListNode* tmp = cur->nxet;

                cur->next = cur->next->next;   // 完成步骤一

                cur->next->next = tmp; //完成步骤二

        3、对于步骤三,同样可以先保存,再改指向

                ListNode* tmp = cur->nxet;

                ListNode* tmp1 = cur->nxet->next->next;

                cur->next = cur->next->next;   // 完成步骤一

                cur->next->next = tmp; //完成步骤二

                cur->nxet->next->next = tmp1;  //完成步骤三

         4、接下来循环便重复操作就行了

                 cur = cur->nxet->next;

对于循环条件有以下解释: 

  • while (prev.next != nu11 && prev.next.next != nu11) 这边为什么是&& 不是|| 一个是对于偶数个结点的判断 一个是奇数个结点 那不应该是||的关系吗?
    奇数节点就不需要交换了,所以只有满足后面有偶数个节点的时候才会进入循环
  • 循环条件,什么情况应该判断指针本身为空呢?
    可以看这个这个遍历的指针最后需要走到哪里  需不需要对最后一个节点做操作

C++版本:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead = new ListNode(0);dummyHead->next = head;ListNode* cur = dummyHead;while(cur->next != nullptr && cur->next->next != nullptr){ListNode* tmp = cur->next;ListNode* tmp1 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = tmp;cur->next->next->next = tmp1;cur = cur->next->next;}head = dummyHead->next;delete dummyHead;return head;}
};

Python版本:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:dummyHead = ListNode()dummyHead.next = headcur = dummyHeadwhile(cur.next != None and cur.next.next != None):tmp = cur.nexttmp1 = cur.next.next.nextcur.next = cur.next.nextcur.next.next = tmpcur.next.next.next = tmp1cur = cur.next.nextreturn dummyHead.next

19. 删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

 

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

解法一:

        拿到这个题,第一想法是计算出整个长度L,然后删除第L+1-n个结点。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyHead = new ListNode(0);dummyHead->next = head;ListNode* cur = dummyHead;int L = 0;while(cur->next!=nullptr){   //计算长度LL++;cur = cur->next;}ListNode* cur1 = dummyHead;for(int i = 0; i<L-n; i++){   //移动到删除结点的前一结点cur1 = cur1->next;}ListNode* tmp = cur1->next;cur1->next = cur1->next->next;delete tmp;head = dummyHead->next;delete dummyHead;return head;}
};

解法二:双指针法,不得不说卡哥的双指针法用得太多了

其思想是定义fast指针和slow指针,初始值为虚拟头结点,f

ast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作)fast和slow同时移动,直到fast指向末尾,此时slow指向需要删除的前一结点。再删除相应结点即可。

C++版本:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyHead = new ListNode(0);dummyHead->next = head;ListNode* fast = dummyHead;ListNode* slow = dummyHead;while(n--){fast = fast->next;}fast = fast->next;                 //fast 走n+1步while(fast != nullptr){fast = fast->next;slow = slow->next;            //slow移动到删除结点的前一结点}slow->next = slow->next->next;   //删除slow后一结点head = dummyHead->next;delete dummyHead;return head;  }
};

   Python版本:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:dummyHead = ListNode()dummyHead.next = headfast = dummyHeadslow = dummyHeadn += 1while(n):n -= 1fast = fast.nextwhile(fast!=None):fast = fast.nextslow = slow.nextslow.next = slow.next.nextreturn dummyHead.next 

面试题 02.07. 链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

 

思路:

简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。

由于是求相交节点,那么对AB来说,从相交结点到末尾结点的长度是相等的。于是可以定义两个指针,假设A链表长度更长,CurA指向A的Head,CurB指向B的Head,求出A的长度LA,B的长度LB,先让A移动LA-LB的位置,此时CurA和CurB再一起移动,通过判断地址是否相等,就可以得出是否有相交结点。

 C++版本:直接抄了,不难。

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* curA = headA;ListNode* curB = headB;int lenA = 0, lenB = 0;while (curA != NULL) { // 求链表A的长度lenA++;curA = curA->next;}while (curB != NULL) { // 求链表B的长度lenB++;curB = curB->next;}curA = headA;curB = headB;// 让curA为最长链表的头,lenA为其长度if (lenB > lenA) {swap (lenA, lenB);swap (curA, curB);}// 求长度差int gap = lenA - lenB;// 让curA和curB在同一起点上(末尾位置对齐)while (gap--) {curA = curA->next;}// 遍历curA 和 curB,遇到相同则直接返回while (curA != NULL) {if (curA == curB) {return curA;}curA = curA->next;curB = curB->next;}return NULL;}
};

142.环形链表II

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

解法思路:

       1、判断是否有环:可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。

        2、如果有环,如何找到这个环的入口

                

假设从头结点到环形入口节点 的节点数为x。 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。

slow指针走的数目: x+y

fast指针走的数目:x+y+n(y+z)

 由于:fast指针走过的节点数 = slow指针走过的节点数 * 2

则 (x + y) * 2 = x + y + n (y + z)

则 x + y = n (y + z)

则 x = n (y + z) - y = (n - 1) (y + z) + z

当 n为1的时候,公式就化解为 x = z,这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点

那么 n如果大于1是什么情况呢,就是fast指针在环形转n圈之后才遇到 slow指针。

C++版本:直接借鉴代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;// 快慢指针相遇,此时从head 和 相遇点,同时查找直至相遇if (slow == fast) {ListNode* index1 = fast;ListNode* index2 = head;while (index1 != index2) {index1 = index1->next;index2 = index2->next;}return index2; // 返回环的入口}}return NULL;}
};

http://www.dinnco.com/news/68640.html

相关文章:

  • 有名的网站建设公司域名查询注册信息查询
  • 响应式网站建设定制网络媒体推广方案
  • 阿里云做网站选什么主机信息流投放
  • 那些网站分享pr做的视频最新疫情爆发
  • 做百度联盟做什么类型网站搜索网站有哪几个
  • 服务关系型网站怎么做2345网址中国最好
  • 设计师培训流程seo软文是什么
  • 湖北建设网站适合小学生摘抄的新闻2022年
  • 做招聘网站怎么赚钱seo技术优化服务
  • 龙湖地产 网站建设免费制作个人网站
  • 网站首页制作公司百度推广人联系方式
  • 电脑做系统哪个网站比较好培训班招生方案
  • 中国建设监理网站体验营销策略有哪些
  • 网络架构师和网络工程师区别搜索引擎优化的具体措施
  • 网站域名密码常州百度推广代理公司
  • 网站建设 会员可以看的内容更多成都网站维护
  • 电信网站备案查询系统百度世界排名
  • 沧州做网站哪家公司好win10优化大师免费版
  • 如何查询网站备案进度查询宝鸡网站seo
  • 简述电子商务网站建设流程郑州seo顾问热狗
  • 做摄影网站网站设计公司网站制作
  • 拍卖网站制作yandex搜索引擎入口
  • 室内装修3d动态演示效果图搜索引擎优化效果
  • 做外贸怎样利用免费b2b网站企业网站推广的一般策略
  • 滨州内做网站的公司网络营销费用预算
  • 北京做网站建设的公司高端营销型网站制作
  • 大馆陶网站百度网盘资源分享
  • 网站开发项目外包独立站搭建要多少钱
  • 电子商务网站开发的意义百度公司注册地址在哪里
  • 两个彩票网站做赔付杭州疫情最新消息