2021-07-15

算法-链表

算法-链表

 

    云想衣裳花想容,春风拂槛露华浓。

 

简介:算法-链表

一、从尾到头打印链表

1、题目描述

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
输入:{1,2,3}返回值:[3,2,1]

2、解题思路

使用递归

要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。

 1 import java.util.*; 2 public class Solution { 3  public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 4   ArrayList<Integer> ret = new ArrayList<>(); 5   if (listNode != null) { 6    // 递归 7    ret.addAll(printListFromTailToHead(listNode.next)); 8    ret.add(listNode.val); 9   }10   return ret;11  }12 }

View Code

二、删除链表中重复的节点

1、题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

输入:{1,2,3,3,4,4,5}返回值:{1,2,5}

2、解题思路

借助辅助头结点,可避免单独讨论头结点的情况。设置两个结点 pre 和 cur,当 cur 和 cur.next 值相等,cur 一直向前走,直到不等退出循环,这时候 cur 指的值还是重复值,调整 cur 和 pre 的指针再次判断。

 1 /* 2 删除链表中重复的结点 3 */ 4 public class Solution { 5  public ListNode deleteDuplication(ListNode pHead) { 6   /* 7   构建辅助头结点 8   对于链表而言,不保存的意思也就是跳过这一结点next指向下一个结点 9   */  10   ListNode head=new ListNode(-1);11   head.next=pHead;12   ListNode saveHead=head;//保存下来的结点13   ListNode currentNode=pHead;14   while(currentNode!=null){15    if(currentNode.next!=null && currentNode.val==currentNode.next.val) {//有重复了,跳过16     while (currentNode.next != null && currentNode.val == currentNode.next.val) {17      currentNode = currentNode.next;//跳过这些相同结点18     }19     currentNode=currentNode.next;//有重复,一个都不保存20     saveHead.next=currentNode;//保存21    }22    else {23     //这里是没重复的24     saveHead=currentNode;25     currentNode=currentNode.next;26    }27   }28   return head.next;29  }30 }

View Code

三、链表中倒数第K 个结点

1、题目描述

输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k 个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。
输入:{1,2,3,4,5},1 返回值:{5}

2、解题思路

在链表中:倒数的+顺数的长度等于链表总长度,所以可以设置两个指针,一个先走K 步,剩下的到链表的末尾要走的步数就是倒数第k个节点,需要从头开始走的步数。

 1 import java.util.*; 2  3 /* 4  链表中倒数最后k 个结点 5 */ 6 public class Solution { 7  public ListNode FindKthToTail (ListNode pHead, int k) {   8   ListNode first = pHead; 9   for(int i = 0; i < k; i++){10    if(first == null){11     return first;12    }13    first = first.next;14   }15   ListNode last = pHead;16   while(first != null){17    first = first.next;18    last = last.next;19   }20   return last;21  }22 }

View Code

四、链表中环的入口结点

1、题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
输入:{1,2},{3,4,5}返回值:3说明:返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3 

2、解题思路

使用双指针,一个快指针 fast 每次移动两个节点,一个慢指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。

假设环入口节点为 y1,相遇所在节点为 z1。

假设快指针 fast 在圈内绕了 N 圈,则总路径长度为 x+Ny+(N-1)z。z 为 (N-1) 倍是因为快慢指针最后已经在 z1 节点相遇了,后面就不需要再走了。

而慢指针 slow 总路径长度为 x+y。

因为快指针是慢指针的两倍,因此 x+Ny+(N-1)z = 2(x+y)。

我们要找的是环入口节点 y1,也可以看成寻找长度 x 的值,因此我们先将上面的等值分解为和 x 有关:x=(N-2)y+(N-1)z。

上面的等值没有很强的规律,但是我们可以发现 y+z 就是圆环的总长度,因此我们将上面的等式再分解:x=(N-2)(y+z)+z。这个等式左边是从起点x1 到环入口节点 y1 的长度,而右边是在圆环中走过 (N-2) 圈,再从相遇点 z1 再走过长度为 z 的长度。此时我们可以发现如果让两个指针同时从起点 x1 和相遇点 z1 开始,每次只走过一个距离,那么最后他们会在环入口节点相遇。

 1 /* 2 链表中环的入口结点 3 */ ......

原文转载:http://www.shaoqun.com/a/878493.html

跨境电商:https://www.ikjzd.com/

adore:https://www.ikjzd.com/w/2202

斑马物流:https://www.ikjzd.com/w/1316

一淘网:https://www.ikjzd.com/w/1698


算法-链表    云想衣裳花想容,春风拂槛露华浓。简介:算法-链表一、从尾到头打印链表1、题目描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。输入:{1,2,3}返回值:[3,2,1]2、解题思路使用递归要逆序打印链表1->2->3(3,2,1),可以先逆序打印链表2->3(3,2),最后再打印第一个节点1。而链表2->3可以看成一个新的链表,
如何穿卸滑雪板 :http://www.30bags.com/a/414000.html
如何从广州出发去六祖寺?:http://www.30bags.com/a/399320.html
如何从九寨沟到黄龙 :http://www.30bags.com/a/410907.html
如何从曼谷到芭提雅?:http://www.30bags.com/a/405096.html
㖭我下面开车 在颠簸的路上一进一出:http://lady.shaoqun.com/a/248411.html
半夜洗干净请你吃鲍鱼 宝贝你的扇贝夹到我了:http://lady.shaoqun.com/a/247496.html
口述我和两女玩双飞的经历 那一夜夹得我好紧好爽:http://lady.shaoqun.com/m/a/248286.html
妈妈说一周一次 姐今天晚上就是你的人:http://lady.shaoqun.com/m/a/247748.html
2021年7月深圳音乐厅美丽星期天演出安排:http://www.30bags.com/a/503642.html
打开放肆枪射击模式后确诊梅毒!:http://lady.shaoqun.com/a/422145.html
来厦门出差后意外怀孕,男同事行为异常太可疑...去吃饭前想好四个问题:http://lady.shaoqun.com/a/422147.html
古代女性的四个"私人物品"羞于见人,现在也不是稀奇的东西了:http://lady.shaoqun.com/a/422148.html

No comments:

Post a Comment