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

单链表的定义:

/**
* 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. vue 前端判断输入框不能输入0 空格。特殊符号。

    oninput="value=value.replace(/[^\d.]/g,'').replace(/\.{2,}/g,'.').replace('.','$#$').replace(/\ ...

  2. 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar

    t老师的做法好神…… 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...

  3. webpack4搭建Vue开发环境笔记~~持续更新

    项目git地址 一.node知识 __dirname: 获取当前文件所在路径,等同于path.dirname(__filename) console.log(__dirname); // Prints ...

  4. 10个MCU常用的基础知识

    转自:http://bbs.21ic.com/icview-2659278-1-1.html 1.MCU有串口外设的话,在加上电平转换芯片,如MAX232.SP3485就是RS232和RS485接口了 ...

  5. Linux实现内容分发的主备模式的智能DNS

    BIND实现智能DNS的原理是通过view的方式,首先判断客户请求的来源,然后返回不同的IP 规划:为za.com域进行智能解析 分2个网段,192.168.1.0/24网段的请求解析到192.168 ...

  6. UVa 1366 DP Martian Mining

    网上的题解几乎都是一样的: d(i, j, 0)表示前i行前j列,第(i, j)个格子向左运输能得到的最大值. d(i, j, 1)是第(i, j)个格子向上运输能得到的最大值. 但是有一个很关键的问 ...

  7. .NET开发时让人头痛的SESSION超时

    前言 不知道大家在使用用.NET的SESSION的时候有没有遇到过很奇怪的问题,不时候不知道怎么回事,这个SESSION就无缘无故的丢失了 怎么也想不通,不是说SESSION很可靠的吗?这个问题要好好 ...

  8. 05-python进阶-简单监控程序开发

    #!/usr/bin/env python #coding:utf-8 ''' 监控监控程序 ''' import json import urllib import inspect import o ...

  9. 静态方法,Arrays类,二维数组

    一.静态方法 静态方法属于类的,可以直接使用类名.方法名()调用. 静态方法的声明 访问修饰符 static 类型 方法名(参数列表) { //方法体 } 方法的作用:一个程序分解成几个方法,有利于快 ...

  10. 在Asp.net MVC中添加一个全局的异常处理的过滤器及Log4Net的使用

    1:捕获异常新建一个异常处理的类MyExceptionAttribute捕获异常信息. //写到日志中.多个线程同时操作一个文件,造成文件的并发,这时用队列 public static Queue&l ...