我要好offer之 链表大总结
单链表是一种递归结构,可以将单链表看作特殊的二叉树(我把它叫做一叉树)
单链表的定义:
/**
* 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之 链表大总结的更多相关文章
- 我要好offer之 二叉树大总结
一. 二叉树定义 二叉树具有天然的递归特性,凡是二叉树相关题,首先应该联想到递归 struct BinTreeNode { BinTreeNode* left; BinTreeNode* right; ...
- 我要好offer之 网络大总结
1. TCP协议的状态机 TCP一共定义了11种状态,这些状态可以使用 netstat 命令查看 @左耳朵耗子 tcp系列教程: 上篇 下篇 2. TCP建立连接3次握手.释放连接4次握手 TCP包头 ...
- 我要好offer之 搜索算法大总结
1. 二分搜索 详见笔者博文:二分搜索的那些事儿,非常全面 2. 矩阵二分搜索 (1) 矩阵每行递增,且下一行第一个元素大于上一个最后一个元素 (2) 矩阵每行递增,且每列也递增 3. DFS 深度优 ...
- 我要好offer之 C++大总结
0. Google C++编程规范 英文版:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml 中文版:http://zh-g ...
- 《剑指offer》 链表中倒数第k个节点
本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历 ...
- 剑指Offer:链表中环的入口节点【23】
剑指Offer:链表中环的入口节点[23] 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和 ...
- 剑指Offer:链表中倒数第k个结点【22】
剑指Offer:链表中倒数第k个结点[22] 题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思考 我们定义两个指针L和R,R事先移动K-1个位置,然后两者同时往后移动直到遇到R的下个节点为 ...
- 剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点 Offer 22 常规解法 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可. package com.walega ...
- 力扣 - 剑指 Offer 22. 链表中倒数第k个节点
题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...
随机推荐
- d3网址
官网: http://d3js.com D3创始人 http://bost.ocks.org.mike 教程: http://www.dashingd3js.com/table-of-contents ...
- Element-ui tree组件自定义节点使用方法
工作上使用到element-ui tree 组件,主要功能是要实现节点拖拽和置顶,通过自定义内容方法(render-content)渲染树代码如下~ <template> <di ...
- matplotlib subplot 子图
总括 MATLAB和pyplot有当前的图形(figure)和当前的轴(axes)的概念,所有的作图命令都是对当前的对象作用.可以通过gca()获得当前的axes(轴),通过gcf()获得当前的图形( ...
- matplotlib绘图(一)
绘制这折现图 导入响应的包 import numpy as npimport pandas as pdfrom pandas import Series,DataFrame%matplotlib in ...
- JQ之$.ajax()方法以及ajax跨域请求
AJAX(Asynchronous javascript AND xml :异步javascript和xml):是一种创建交互式网页应用的网页开发技术.AJAX可以在不重新加载整个页面的情况下与服务器 ...
- destoon 后台管理左侧新增菜单项
destoon 后台菜单设置在对应模块的admin/menu.inc.php 例如要在后台会员管理里增加会员承包和股东管理 $menu = array( array('添加会员', '?modulei ...
- Thinkhphp5控制器调用的Model层的方法总结
控制器器里: <?php /** * Created by PhpStorm. * User: Haima * Date: 2018/7/8 * Time: 15:58 */ namespace ...
- redis的字符串操作以及在django中的使用
redis ----redis.MongoDB : 非关系型数据库 redis 存储在内存中 MongoDB 存储在硬盘中 l 简介 redis是一个key-value存储系统 , 支持持久化 ...
- Docker工具
虚拟化 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源, 如服务器.网络.内存及存储等,予以抽象.转换后呈现出来, 打破实体结构间的 ...
- 如何把list当成栈或者队列来用
在python里,list和在C.java里的数组差不多,但是python里的list是可变长的,而且python语言也支持倒叙读取,如list[-1]可以读取最后一个元素.但这还不是最厉害的,lis ...