linked

160. Intersection of Two Linked Lists

安稳与你 提交于 2020-02-25 12:39:53
题目链接: https://leetcode.com/problems/intersection-of-two-linked-lists/ 解题思路: 两个链表的公共节点,首先让长的链表先走length1-length2步,然后一起走 1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 14 15 int lengthA= getlength(headA); 16 int lengthB = getlength(headB); 17 18 19 if(lengthA>lengthB) 20 { 21 for(int i=0;i<lengthA-lengthB;i++) 22 { 23 headA = headA.next; 24 } 25 } 26 else 27 { 28 for(int

Reverse Linked List II 单向链表逆序(部分逆序)

荒凉一梦 提交于 2020-02-22 15:02:28
0 问题描述 原题点击这里。 将单向链表第 m 个位置到第 n 个位置倒序连接。例如, 原链表: 1-> 2->3->4 ->5, m=2, n =4 新链表: 1-> 4->3->2 ->1 (注:最终的新链表记为 head ,过程中临时使用的一个链表头记为 h ) 1 基本思路 首先考虑整个链表的情况。见到单向链表的第一反应自然是轮询链表 head 中每个节点,轮询过程中按需要建立一个新链表 h ,每次访问一个节点,就将这个节点放在前一个访问的节点之后,这样便实现了倒序。 然后再考虑部分倒序。要部分倒序,便要找出这部分从哪里开始,从哪里结束,根据前面的方法将该部分倒序之后,将倒序后的部分链表链上其他部分。 2 单向链表逆序 假设有三个节点,其过程如图( 1 )所示。 第一步取出 node1 ,新链头指向 node1 , node1->next 指向空,其他部分不变; 第二步取出 node2 ,新链头指向 node2 , node2->next 指向前一个访问的节点(即 node1 ) ; 第二步取出 node3 ,新链头指向 node3 , node3->next 指向前一个访问的节点(即 node2 ) ; 从这个过程中可以看到几点: 这是一个循环过程。循环的次数 = 链表中节点的个数。 每个节点都访问了且只访问一次,因而时间复杂度是 O(n) 。 需要三个辅助变量。 1

leetcode206. Reverse Linked List

旧街凉风 提交于 2020-02-21 03:08:25
题目描述 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/reverse-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 代码 # include <iostream> using namespace std ; struct ListNode { int val ; ListNode * next ; ListNode ( int x ) : val ( x ) , next ( NULL ) { } } ; // Iterative // Time Complexity: O(n) // Space Complexity: O(1) class Solution { public : ListNode * reverseList ( ListNode * head ) { ListNode * pre = NULL ; ListNode * cur = head ; while ( cur != NULL ) { ListNode * next = cur - > next ; cur -

链表(LInked LIst)——链表介绍

风格不统一 提交于 2020-02-16 00:23:02
Linked Lists (链表) 链表是一种线性数据结构,链表中的每一个元素都是一个单独的对象,我们将其称之为节点。每个节点包含一个数据域和一个指向下一个节点的指针域。这些节点可能存储在内存中的不同位置,而不像数组那样存储在连续的内存空间中。 链表中可以存储类似于数组的数据,但是相比数组,链表在存储上具有更多优势。 想象以下人的关系链。如果A认识B,B认识C,那么C就可以通过这个连接链接到A。每个人都可以被视为认识下一个人的节点。 在C语言中,我们定义一个包含数据域和指针域的Node如下: struct Node { int data ; int Node * next ; } 与数组相比具有的优势 与数组相比,链表具有以下两大优势: 没有固定大小 链表不需要固定内存大小。当创建一个新节点时,将动态分配用于存储节点的内存位置。没有使用的位置不会占据内存地址。与数组相比,数组智能一次性固定内存大小,且扩充或者缩减数组时代价会非常昂贵。 插入和删除效率极高 在节点之间进行快速删除和插入所花费的时间恒定。相反,处理数组时,插入和删除需要遍历数组中的所有元素。 算法复杂度 Access Search Insertion Deletion Space O(n) O(n) O(1) O(1) O(n) 与数组相比具有的劣势 与数组相比,使用链表存在一些缺点 仅能通过线性访问

单链表(Singly LInked LIst)

邮差的信 提交于 2020-02-15 05:32:49
单链表(Singly Linked List) 单链表是比较常见的链表类型。其中每个节点都有一个指向序列下一个节点的指针。这意味着,对链表执行遍历时,只能在一个方向上从头到尾的遍历;为了能够访问链表中的最后一个节点,我们需要遍历链表中的所有元素。 单链表最后一个节点的指针域通常为NULL,在遍历到这个节点时,它指定当前链表已经结束,没有其它要遍历的节点了。 单链表的实现 定义节点 节点由两个部分组成,一个部分存储本身的数据,另一部分存储序列中下一个节点所在的内存地址。为了简单表示,我们使用一个整数作为节点的数据域,节点的数据域不仅仅局限于一个数值,可以是其它复杂的数据类型。 在C语言中,节点被定义为structure.该节点中的一个节点指向同类节点的另外一个节点。 struct Node { int data ; struct Node * next ; } * head = NULL ; 首先使用所需变量名创建一个新的节点,我们将其称之为newNode: struct Node * newNode ; 可以使用箭头字符访问存储在此Node中的数据: newNode -> data 同样的,使用执行节点的 *next 成员访问当前序列中的下一个节点: newNode -> next 头指针节点 头指针节点用于链表的第一个节点,用于标识链表的起点,并为链表的遍历提供入口。

Leetcode142. Linked List Cycle II

我只是一个虾纸丫 提交于 2020-02-15 01:38:19
Leetcode142. Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list. Note: Do not modify the linked list. Example 1: Input: head = [3,2,0,-4], pos = 1 Output: tail connects to node index 1 Explanation: There is a cycle in the linked list, where tail connects to the second node. Example 2: Input: head = [1,2], pos = 0 Output:

237. Delete Node in a Linked List

二次信任 提交于 2020-02-08 09:23:43
237. 删除链表中的节点 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. 说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表中的一个有效节点。 不要从你的函数中返回任何结果。 解法一 //时间复杂度O(1), 空间复杂度O(1) /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void deleteNode(ListNode*

876. Middle of the Linked List - LeetCode

橙三吉。 提交于 2020-02-08 09:02:55
Question 876. Middle of the Linked List Solution 题目大意:求链表的中间节点 思路:构造两个节点,遍历链接,一个每次走一步,另一个每次走两步,一个遍历完链表,另一个恰好在中间 Java实现: public ListNode middleNode(ListNode head) { ListNode slow = head; ListNode fast = head; while (fast != null) { fast = fast.next; if(fast != null) { fast = fast.next; slow = slow.next; } } return slow; } 来源: https://www.cnblogs.com/okokabcd/p/9406821.html

Leetcode 206: Reverse Linked List

倖福魔咒の 提交于 2020-02-05 21:03:58
问题描述 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both? 思路与实现 way1 迭代 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList ( ListNode head ) { ListNode pre = null ; ListNode curr = head ; while ( curr != null ) { ListNode temp = curr . next ; curr . next = pre ; pre = curr ; curr = temp ; } return pre ; } } 来源: CSDN 作者: ying____

92. Reverse Linked List II

走远了吗. 提交于 2020-02-05 16:05:01
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Example: Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseBetween ( ListNode head , int m , int n ) { if ( head == null || head . next == null ) return head ; ListNode cur = head , pre = null ; while