单链表是一种递归结构,可以将单链表看作特殊的二叉树(我把它叫做一叉树)

单链表的定义:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/

1. O(1)时间删除结点

ListNode* DeleteNode(ListNode* pHead, ListNode* deletedNode) {
assert(pHead != NULL && deletedNode != NULL);
ListNode newHead(-);
newHead.next = pHead;
if (pHead == deletedNode) {
newHead->next = pHead->next;
delete deletedNode;
deketedNode = NULL;
return newHead.next;
} else {
if (deleteNode->next == NULL) {
ListNode* cur = pHead;
while (cur->next != deleteNode) {
cur = cur->next;
}
cur->next = NULL;
delete deletedNode;
deletedNode = NULL;
return newHead.next;
} else {
ListNode* nextNode = deletedNode->next;
deletedNode->val = nextNode->val;
deletedNode->next = nextNode->next;
delete nextNode;
nextNode = NULL;
return newHead.next;
}
}
}

2. 单链表反转

ListNode* ReverseList(ListNode* pHead) {
if (pHead == NULL || pHead->next == NULL) {
return pHead;
}
ListNode* tail = pHead;
ListNode* cur = pHead->next;
while (cur != NULL) {
ListNode* nextNode = cur->next;
cur->next = pHead;
pHead = cur;
cur = nextNode;
}
tail->next = NULL;
return pHead;
}

3. 单链表倒数第k个结点

ListNode* KthNode(ListNode* pHead, int k) {
assert(pHead != NULL && k > );
ListNode* first = pHead;
ListNode* second = pHead;
while (first != NULL && k > ) {
first = first->next;
--k;
}
if (first == NULL) {
if (k == ) {
return pHead;
} else {
return NULL;
}
}
while (first != NULL) {
first = first->next;
second = second->next;
}
return second;
}

4. 单链表反转部分区间

5. 单链表快速排序的一趟划分

6. 单链表去掉重复元素

7. 单链表旋转

8. 单链表成对交换节点

9. 有序单链表归并排序

10. 单链表加法运算

11. 单链表是否存在环,环的位置

12. 两个单链表的第一个公共结点

13. 单链表归并排序

class Solution {
public:
ListNode *sortList(ListNode *head) {
if (head == NULL || head->next == NULL) {
return head;
} ListNode* slow = head;
ListNode* fast = head;
//快慢指针找链表中间结点
while (fast != NULL && fast->next != NULL && fast->next->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* list1 = head;
ListNode* list2 = slow->next;
slow->next = NULL;
ListNode* sortList1 = sortList(list1);
ListNode* sortList2 = sortList(list2);
ListNode* res = mergeSortList(sortList1, sortList2);
return res;
} ListNode* mergeSortList(ListNode* list1, ListNode* list2) {
if (list1 == NULL) return list2;
if (list2 == NULL) return list1;
ListNode newHead(-);
ListNode* cur = &newHead;
ListNode* node1 = list1;
ListNode* node2 = list2;
while (node1 != NULL && node2 != NULL) {
if (node1->val <= node2->val) {
cur->next = node1;
node1 = node1->next;
cur = cur->next;
} else {
cur->next = node2;
node2 = node2->next;
cur = cur->next;
}
}
while (node1 != NULL) {
cur->next = node1;
node1 = node1->next;
cur = cur->next;
}
while (node2 != NULL) {
cur->next = node2;
node2 = node2->next;
cur = cur->next;
}
return newHead.next;
}
};

我要好offer之 链表大总结的更多相关文章

  1. 我要好offer之 二叉树大总结

    一. 二叉树定义 二叉树具有天然的递归特性,凡是二叉树相关题,首先应该联想到递归 struct BinTreeNode { BinTreeNode* left; BinTreeNode* right; ...

  2. 我要好offer之 网络大总结

    1. TCP协议的状态机 TCP一共定义了11种状态,这些状态可以使用 netstat 命令查看 @左耳朵耗子 tcp系列教程: 上篇 下篇 2. TCP建立连接3次握手.释放连接4次握手 TCP包头 ...

  3. 我要好offer之 搜索算法大总结

    1. 二分搜索 详见笔者博文:二分搜索的那些事儿,非常全面 2. 矩阵二分搜索 (1) 矩阵每行递增,且下一行第一个元素大于上一个最后一个元素 (2) 矩阵每行递增,且每列也递增 3. DFS 深度优 ...

  4. 我要好offer之 C++大总结

    0. Google C++编程规范 英文版:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml 中文版:http://zh-g ...

  5. 《剑指offer》 链表中倒数第k个节点

    本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历 ...

  6. 剑指Offer:链表中环的入口节点【23】

    剑指Offer:链表中环的入口节点[23] 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和 ...

  7. 剑指Offer:链表中倒数第k个结点【22】

    剑指Offer:链表中倒数第k个结点[22] 题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思考 我们定义两个指针L和R,R事先移动K-1个位置,然后两者同时往后移动直到遇到R的下个节点为 ...

  8. 剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 Offer 22 常规解法 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可. package com.walega ...

  9. 力扣 - 剑指 Offer 22. 链表中倒数第k个节点

    题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...

随机推荐

  1. mysql中的空值问题

    MySQL的查询如果需要用到空值的情况下,where后面的条件就需要注意了 MySQL中的表示空值的方法:is null 和 is not null 比如:select * from user whe ...

  2. 获取kafka的lag, offset, logsize的shell和python脚本

    python脚本 #!/usr/bin/env python import os import re import sys group_id=sys.argv[1] pn=sys.argv[2] ka ...

  3. 《毛毛虫组》【Alpha】Scrum meeting 3

    第二天 日期:2019/6/16 1.1 今日完成任务情况以及遇到的问题. 今日完成任务情况: 货物入库管理模块设计: (1)对数据库表--tb_InStore进行修改并完善: (2)学习SQL Se ...

  4. mini_httpd的安装和配置

    1.下载:http://www.acme.com/software/mini_httpd/mini_httpd-1.19.tar.gz 2.解压:tar zxvf mini_httpd-1.19.ta ...

  5. c3p0,dbcp和proxool

    关于c3p0.dbcp和proxool,之类的比较,配置在网上有很多的文章,我这边就不浪费大家的时间了,主要讲下我用过这三个之后的体会. dbcp:框架以前使用的是dbcp,网上说,有很多BUG,至少 ...

  6. Service Unavailable HTTP Error 503. The service is unavailable.

    原因: public void SetCurrentType(string[] projTypes) { _ProjTypes = _ProjTypes; } 确保没有无限递归或无限循环

  7. 【dp】石子归并

    玄学NPC 题目描述 有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小. 输入 输入第一行只有一个整数n(1≤n≤50),表示有n堆石子.接下去的n ...

  8. Python入门:Python基础笔记

    (C语言:)C语言是相对C++.C#.Java等语言更接近底层,并且一些硬件编程都可以使(只能使用)C语言.另外C语言学起来相对困难,因为涉及到指针,指针也是语言接近底层语言的一个特征.目前编写较大的 ...

  9. Yii2 基于rbac访问控制

    Yii2 是一款非常强大的PHP底层框架, 牛b的人都喜欢用它, 有时候你们可能会发现, Yii2 底层处理不是很好, 比如: 每次分页, yii底层都会多统计一次数据的总条数!  那只能说你对它还不 ...

  10. Python基础——类

    创建类 class people: '帮助信息:dsafdaf' #所有实例都会共享的 number=100 #构造函数,初始化的方法,当创建一个类的时候,首先会调用它 def __init__(se ...