链表
wnjason
这个作者很懒,什么都没留下…
展开
-
LeetCode---Linked List Cycle
题目大意: 给出一个链表,判断其中是否存在环。 算法思想: 利用一个map容器对每个节点做标记,遍历链表中的每个节点,如果该节点做过标记则存在环。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNo原创 2015-09-24 21:04:55 · 264 阅读 · 0 评论 -
LeetCode---Delete Node in a Linked List
题目大意:给出一个链表中的节点,在链表中删除该节点,如果是尾节点则不删除。如:链表 1 -> 2 -> 3 -> 4 要删除链表中值为3的节点,则操作后的链表为1 -> 2 -> 4。 算法思想: 1.设置一个前驱节点和一个后继节点。 2.判断后继节点是否为空,若为空则是尾节点直接返回。否则遍历链表。 3.从要删除节点开始,一次将后继节点中的值向前移动,直到遍历完链表为止。 4.删除链表原创 2015-09-18 12:21:17 · 324 阅读 · 0 评论 -
LeetCode---Remove Nth Node From End of List
题目大意:给出一个链表,和一个数n,从链表尾部开始删除第n个节点。返回修改后的链表。 算法思想: 遍历量表,将链表中的每个节点记录下来,然后计算要删除链表的前驱,反向删除第n个节点。如果要删除的节点是头结点或尾节点需要特殊处理。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int v原创 2015-10-08 19:29:48 · 264 阅读 · 0 评论 -
LeetCode---Remove Linked List Elements
题目大意:给出一个链表,和一个要移除元素,返回移除了所有元素的链表。 算法思想: 1.首先,判断表头的元素与所给元素是否相等,采用循环的方式移除所有与表头元素。 2.采用前驱指针的方法,通过遍历链表,移除链表中符合要求的元素。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int v原创 2015-10-10 19:37:25 · 240 阅读 · 0 评论 -
LeetCode---Convert Sorted List to Binary Search Tree
题目大意:给出一个已排好序的升序链表,将其转化为一颗高度平衡的二叉搜索树。 算分思想: 1.遍历一遍链表,将链表中的元素放在容器中。 2.采用分治法将一个链表分为两半,一半对应BST的左子树,一半对应BST的右子树。 3.递归生成转换好的二叉搜索树(BST)。 代码如下: /** * Definition for singly-linked list. * struct ListN原创 2015-10-14 20:41:37 · 387 阅读 · 0 评论 -
LeetCode---Intersection of Two Linked Lists
题目大意:给出两个链表,寻找出两个链表的汇聚节点。 算法思想: 1.分别遍历两个链表,将链表中的节点存入容器中。 2.扫描两个容器找出汇聚节点,如果不存在汇聚节点返回NULL。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next原创 2015-10-14 16:50:38 · 254 阅读 · 0 评论 -
LeetCode---Partition List
题目大意:给出一个链表和一个基准元素,将该链表划分为两部分使得前部分元素都小于基准元素,后部分元素都大于或等于基准元素。 算法思想: 1.遍历链表,将小于基准元素的节点连接起来。同时将大于基准元素的节点连接起来。 2.最后将两部分链表连接起来返回。 3.需注意三种情况。(1)所有元素都小于基准元素(2)所有元素都大于基准元素(3)既存在小于基准元素,又存在大于基准元素。 代码如下: /原创 2015-10-15 14:07:20 · 285 阅读 · 0 评论 -
LeetCode---Palindrome Linked List
题目大意:给出一个链表,判断链表中存放的数是否构成回文。 算法思想: 1.如果链表只有一个节点或者为空,返回真。 2.遍历链表将链表中的元素都放入容器中。 3.首尾比较容器中的元素,如果不相等返回false。当比较完容器中所有的元素后返回真。 代码如下: /** * Definition for singly-linked list. * struct ListNode { *原创 2015-10-15 19:43:48 · 248 阅读 · 0 评论 -
LeetCode---Insertion Sort List
题目大意:给出一个链表,采用插入法对链表进行排序。 算法思想: 1.设置一个表头节点,方便节点的插入。 2.如果链表为空或者只有一个节点,直接返回。 3.按照插入排序的思想,遍历n-1个节点。对于每个节点寻找从头结点到当前节点的合适位置并插入。 4.从头结点到当前位置的节点保证是有序的。 代码如下: /** * Definition for singly-linked list.原创 2015-10-15 18:03:14 · 241 阅读 · 0 评论 -
LeetCode---Linked List Cycle II
题目大意:给出一个链表,判断链表中是否有环,如果有环则返回环的起点,如果没有环则返回NULL。 算法思想: 遍历链表,将链表中的每个节点放入map容器中,并作标记,遍历节点时如果遇到做标记的节点则表明有环并返回该节点。如果遍历完链表则表明没环则返回NULL。 代码如下: /** * Definition for singly-linked list. * struct ListNode原创 2015-10-07 00:50:41 · 292 阅读 · 0 评论 -
LeetCode---Rotate List
题目大意:给出一个链表,将其向右旋转k个节点。 算法思想: 1.如果链表为空或者K==0直接返回。 2.遍历链表,记录链表中的每个节点,并为其编号。 3.反向第K个节点将为表头结点,将尾节点和头结点连接起来。 4.如果K大于链表的长度 k%=list.size. 代码如下: /** * Definition for singly-linked list. * struct Lis原创 2015-10-19 12:15:55 · 275 阅读 · 0 评论 -
Leetcode---Remove Duplicates from Sorted List
题目大意:给出一个已排序了的链表,删除之中重复出现的元素,保证每个元素只出现一次。 算法思想: 1.设置两个指针,一个指向前驱节点,一个指向当前遍历的节点。 2.如果链表为空直接返回。遍历链表,比较前驱节点的元素和当前节点的元素是否相同,如果相同的则做标记,如果不相同则判断是否有标记,如果有则删除重复元素,如果没有标记则移动指针,继续遍历链表。 3.当链表遍历完后判断是否有标记存在原创 2015-09-27 19:47:00 · 249 阅读 · 0 评论 -
LeetCode---Reverse Linked List
题目大意:给出一个单链表,使其逆转。 算法思想: 如果链表为空直接返回,设置3个指针,前驱指针,后继指针,当前遍历指针,然后遍历链表,遵循先继承再修改的原则转换每个节点的后继指针。当链表遍历完后,前驱节点为为头节点。返回修改后的链表。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * in原创 2015-09-27 20:37:48 · 224 阅读 · 0 评论 -
LeetCode---Merge Two Sorted Lists
题目大意:给出两个排序了的链表,要求将它们合并成一个链表,新链表由给出的两个链表拼接而成。 算法思想: 1.判断给出的链表是否有空链表,若有则直接返回不空的。 2.选取两个链表中第一格元素较小的节点做为新链表的头结点。 3.遍历两个链表,将节点值小的节点插入新链表知道,有一个链表遍历完为止。 4.将非空的链表接在新链表的末尾。 5.返回合并后的链表。 代码如下: /** * De原创 2015-09-29 20:44:35 · 309 阅读 · 0 评论 -
LeetCode---Remove Duplicates from Sorted List II
题目大意:给出一个已排序的链表,删除链表中元素个数不为1的链表节点。 算法思想: 1.遍历链表,采用容器记录链表节点,同时为每个节点元素计数。 2.遍历容器,将节点元素个数为1的节点连接起来,释放元素个数大于1的节点。 3.返回修改后的链表。 注意为了方便链表的操作,设置了一个头结点。 代码如下: /** * Definition for singly-linked list.原创 2015-10-17 18:44:52 · 286 阅读 · 0 评论 -
LeetCode---Add Two Numbers
题目大意:给出两个链表,每个链表表示一个逆序的数。将两个链表表示的数相加求和最后以链表的形式返回。 算法思想: 1.如果有一个链表为空,则返回相对的链表。 2.遍历链表。模拟加法进行运算,知道有一个链表为空结束。 3.将不空的链表继续和进位经行加法运算。 4.如果两个链表都遍历完还有进位则新申请一个节点存放进位,连接入表1. 代码如下: /** * Definition for s原创 2015-10-17 20:27:59 · 289 阅读 · 0 评论 -
LeetCode---Sort List
题目大意:给出一个链表,将其排序。要求时间复杂度为O(nlogn),空间复杂度为常数。 算法思想: 1.如果链表为空,直接返回。 2.遍历链表,已链表中的元素之作为键,节点指针作为该节点对应的值,将这个对组放入multimap容器中。 3.利用multimap的特性对链表中的元素进行排序。 4.遍历容器,将容器中排完序的节点串成链表。 5.将尾节点置空,返回链表。 代码如下: cl原创 2015-09-30 19:27:26 · 299 阅读 · 0 评论 -
LeetCode---Swap Nodes in Pairs
题目大意:给出一个链表,成对的交换相邻两个元素的节点,要求不能够修改每个节点的值。 算法思想: 1.对于给出的链表判断其节点个数,如果小于2则直接返回链表。 2.设置4个节点指针,分别指向前驱节点,当前节点,后继节点,缓存节点指针。 3.由于没有表头节点,则对于头两个节点单独进行交换。 4.遍历链表,根据先继承后修改的原则,交换相邻的两个节点。移动后继节点时要注意,如果当前节点为空,则后原创 2015-09-30 17:10:35 · 304 阅读 · 0 评论 -
LeetCode---Reorder List
题目大意:给出一个链表,将链表的首尾节点相邻组成一个新链表。 算法思想: 1.遍历链表,将链表中的节点存放如容器中。 2.遍历容器,交替从容器首尾中取出节点,组成一个链表。 3.去掉添加的头结点。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis原创 2015-10-18 13:56:53 · 297 阅读 · 0 评论 -
LeetCode---Reverse Linked List II
题目大意:给出一个链表和一个区间,将链表在区间内的节点逆转。 算法思想: 1.设置一个表头节点,方便对链表的操作。 2.找到区间内的所有节点,将其放入容器中。 3.遍历容器,将容器中的节点逆转并连接如链表中。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2015-10-15 20:23:22 · 281 阅读 · 0 评论