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

单链表的定义:

/**
* 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. oracle 命中率

    一般在I/O 使用中,为了提高系统处理速度,系统提前将数据读入一块内存区,叫高速缓存,但提前读入的数据未必就是需要的,这就是命中率..计算公式为 命中率=1-(physical reads/(db b ...

  2. 记住密码功能 JS结合JQuery 操作 Cookie 实现记住密码和用户名!

    // 记住密码功能 JS结合JQuery 操作 Cookie 实现记住密码和用户名! var username = document.getElementById("username&quo ...

  3. Chunky Monkey-freecodecamp算法题目

    Chunky Monkey(猴子吃香蕉, 分割数组) 要求 把一个数组arr按照指定的数组大小size分割成若干个数组块. 思路 利用size值和while语句确定切割数组的次数(定义temp将siz ...

  4. kali下安装中文输入法

    参考网址:https://blog.csdn.net/qq_37367124/article/details/79229739 更性源 vim /etc/apt/source.list 设置更新源 更 ...

  5. PHP四种序列化方案

    原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...

  6. ipvsadm分发MySQL读请求

    在MySQL的部署场景中,经常使用HAproxy和ipvs来作为读请求转发的网关.ipvs的好处在于本身不需要daemon的方式来运行,而是直接作为kernel的服务来提供:当ipvs和应用程序服务器 ...

  7. 一个炫酷的flash网站模板

    这是一个炫酷的flash欧美网站模板,它包括首页,公司简介,留言等五个页面,界面转换非常的炫酷!他还有时间.全屏.背景音乐开关的功能!有兴趣的朋友可以看看!贴几张网站图片给大家看看! 下载后直接找到s ...

  8. hdu-1231 连续最大子序列(动态规划)

    Time limit1000 ms Memory limit32768 kB 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj ...

  9. 牛客练习赛22 C 简单瞎搞题

    //位运算 // & 都是1 才是 1 // | 都是0 才是0 // ^ 不一样才是1 #include <iostream> #include <cstdio> # ...

  10. poj 2718 切数问题 穷竭搜索

    题意: 给一个已经排序号的数字,从中间切一刀,成两个数,要求这两个数的差最小 思路:暴力比较差最小值 stl中的next_permutation()函数进行排列  注意:这个函数必须从小到大才可以排序 ...