Leetcode刷题地址:https://leetcode-cn.com/problemset/lcof/题目
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表: 在节点 c1 开始相交。
示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表...
1.LinkedList实现的基本原理
LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first 、last,因为有头尾两个节点,使其很方便分别从头尾操作数据。LinkedList通过内部类Node来保存元素 ,一个Node对象表示一个链表的节点,有多少个元素就需要同样个Node节点。如果要添加元素,则新建一个Node节点,保存这个元素,同时指定其前驱节点和后继节点的引用。若要删除一个元素,则将取消此元素对应的Node节点在链表中的前驱...
【题目】 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回 true 。 否则,返回 false 。 【进阶】 你能用 O(1)(即,常量)内存解决...
leetcode:#206 反转链表
题目详情
java实现
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution { //头插法public ListNode reverseList(ListNode head) {if (head == null) {return null;}ListNode revers...
1 #include <stdio.h>2 #include <stdlib.h>3struct node4{5int data;6struct node*next;7};8int main()9{
10int n,i;
11struct node*head,*p;
12 head=(struct node*)malloc(sizeof(struct node));//为head在这个链表中开辟一个空间。13 head->next=NULL;//一个链表要有结尾。14 scanf("%d",&n);
15for(i=0;i<n;i++)
16 {
17 p=(struct node*)malloc(sizeof(struct node));
18 scanf("%d",&p->dat...
*思路: 先求得两个链表的长度,然后得到长度差diff,再先遍历长链表diff步后,再同时遍历两个链表并比较对象指针。 1/* 2public class ListNode {3 int val;4 ListNode next = null;5 6 ListNode(int val) {7 this.val = val;8 }9}*/10publicclass Solution {
11public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
12if(pHead1==null||pHead2==null)
13 {returnnull;}
14 ...
原题: https://leetcode-cn.com/problems/swapping-nodes-in-a-linked-list/
一、题目要求
给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
示例 1:输入:head = [1,2,3,4,5], k = 2
输出:[1,4,3,2,5]示例 2:输入:head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出:[7,9,6,6,8,7,3,0,9,5]示例 3:输入:head = [1], k = 1
输出:[1] 示例 4:输入...
#pragma once#include "MyLink.h"template<typename T>class MyStack { MyLink<T> lk; MyStack& operator=(const MyStack&); MyStack(const MyStack&);public: MyStack(){} size_t StackGetSize() { return lk.GetSize(); } bool StackPushBack(const T& e) { return lk.AppendElement(e); } bool StackPopBack() { return lk.DeleteTail(); } T StackGetTop() { return lk.GetTail(); } bool StackEmpty() { return GetSize() == ...
A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法打完暴力后突然想到此题用链表实现会很快。因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n$,所以链表中最多有$\sqrt{n}$个元素,所以可以用一个$set$维护当前的出现元素,每次$upper\_bound$找到合适位置插入链表,因为当前元素有序所以可以统计链表后缀来求答案知识点:不要在T1花太长时间,数据结构题可能只用到一些简单数据结构B. Cicada 与排...
题目描述
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
解题思路
1...
创建双链表
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<conio.h>
using namespace std;
typedef struct student
{int data;struct student *next;struct student *pre;
} dnode;
dnode *create()
{dnode *head, *p, *s;int x, cycle = 1;head = (dnode*)malloc(sizeof(dnode));p = head;while (cycle){printf("\nplease input the data:");scanf("%d", &x);if (x != 0){s = (dnode*)malloc(sizeof(dnode))...
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead){if (pHead == NULL) return pHead;if (pHead->next == NULL) return pHead;int First = pHead->val;ListNode* head = new ListNode(First + 1);head->next = NULL;head->next = pHead;ListNode* Cur=head;ListNode* Next=Cur->next;while (Next != NULL){while ((Next->next != NULL) && (Next->next->val == Next->val)){Next = Next->next;}if (Cur->n...
合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察。 例如: 链表1: 1->2->3->4 链表2: 2->3->4->5 合并后: 1->2->2->3->3->4->4->5 解题思路: 挨着比较链表1和链表2。 这个类似于归并排序。尤其要注意两个链表都为空、和其中一个为空的情况。只需要O (1) 的空间。时间复杂度为O (max(len1,len2)) public Node mergeLinkList(Node head1, Node head2) {if (head1 == null && head2 == null) {...
题目82. 删除排序链表中的重复元素 II:题解:
看错题:删除多余的重复节点
emmm...记住了题目在路上想的,结果记错了,实现了删除多余的重复节点的功能,如下虽然但是,把代码还是放一下吧
/*** 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) :...
从尾部到头部打印链表,由于递归,比较简单,所以方法1,使用递归,#include<stdio.h>
#include<stdlib.h>
struct LinkNode{int data;struct LinkNode* next;
};struct LinkNode* createList(){int len = 0 ;printf("input list len\n");scanf("%d",&len); printf("input list elements\n");struct LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode*));if (head == NULL ){printf("head is empty\n");return NULL;}struct Lin...