数据结构:DHUOJ 删除链表的顺数及倒数第N个节点
删除链表的顺数及倒数第N个节点
作者: turbo时间限制: 1S章节: DS:数组和链表
题目描述:
可使用以下代码,完成其中的removeNth函数,其中形参head指向无头结点单链表,n为要删除的结点序号,函数返回新链表的头指针。
#include<iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode() : val(0), next(NULL) {} ListNode(int x) : val(x), next(NULL) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; class Solution { public: ListNode* removeNth(ListNode* head, int n) { //填充本函数完成功能 } }; ListNode *createByTail() { ListNode *head; ListNode *p1,*p2; int n=0,num; int len; cin>>len; head=NULL; while(n<len && cin>>num) { p1=new ListNode(num); n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; } return head; } void displayLink(ListNode *head) { ListNode *p; p=head; cout<<"head-->"; while(p!= NULL) { cout<<p->val<<"-->"; p=p->next; } cout<<"tail\n"; } int main() { ListNode* head = createByTail(); int n; cin>>n; head=Solution().removeNth(head,n); displayLink(head); return 0; }
输入范例 :
5
1 2 3 4 5
2
输出范例:
head-->1-->3-->5-->tail
我的题解:
1 //数据结构:DHUOJ 删除链表的顺数及倒数第N个节点
2 #include<iostream>
3 using namespace std;
4 struct ListNode
5 {
6
7 int val;
8
9 ListNode* next;
10
11 ListNode() : val(0), next(NULL) {}
12
13 ListNode(int x) : val(x), next(NULL) {}
14
15 ListNode(int x, ListNode* next) : val(x), next(next) {}
16
17 };
18 class Solution {
19
20 public:
21
22 ListNode* removeNth(ListNode* head, int n) {
23
24 //特殊情况
25 if (!head)//头结点是空的 就不用删除 直接返回空
26 {
27 return head;
28 }
29 if (!head->next && n == 1) //两个结点的情况2 : 1 2 删除1 2 直接返回空
30 return NULL;
31 ListNode* xinhead = new ListNode;
32
33 xinhead->next = head;//给首元结点定义一个头结点
34 ListNode* p = xinhead, * q = xinhead;
35 ListNode* p_pre = xinhead, * q_pre = xinhead;
36
37 //p遍历到n pre是p的前驱结点
38 for (int i = 0; i < n; i++) {
39 p_pre = p;
40 p = p->next;
41 }
42 ListNode* p1 = p;
43
44 while (p1)//关键点 p到结尾的距离 等于q从首元结点出发到目的地的距离
45 {
46 q_pre = q;
47 q = q->next;
48 p1 = p1->next;
49 }
50
51 if (p == q)//指向头一个地方
52 {
53 p_pre->next = p->next;
54 }
55 else if (p != q && p->next != q && q->next != p)//p和q不相邻
56 {
57 p_pre->next = p->next;
58 q_pre->next = q->next;
59 }
60 else if (p->next == q)//相邻的话特判
61 {
62 p_pre->next = q->next;
63 }
64 else if (q->next == p)
65 {
66 q_pre->next = p->next;
67 }
68 ListNode* ans = xinhead->next;
69 return ans;
70 }
71
72 };
73 ListNode* createByTail()
74
75 {
76
77 ListNode* head;
78
79 ListNode* p1, * p2=NULL;
80
81 int n = 0, num;
82
83 int len;
84
85 cin >> len;
86
87 head = NULL;
88
89 while (n<len && cin >> num)
90
91 {
92
93 p1 = new ListNode(num);
94
95 n = n + 1;
96
97 if (n == 1)
98
99 head = p1;
100
101 else
102
103 p2->next = p1;
104
105 p2 = p1;
106
107 }
108
109 return head;
110
111 }
112 void displayLink(ListNode* head)
113
114 {
115
116 ListNode* p;
117
118 p = head;
119
120 cout << "head-->";
121
122 while (p != NULL)
123
124 {
125
126 cout << p->val << "-->";
127
128 p = p->next;
129
130 }
131
132 cout << "tail\n";
133
134 }
135 int main()
136
137 {
138
139 ListNode* head = createByTail();
140
141 int n;
142
143 cin >> n;
144
145 head = Solution().removeNth(head, n);
146
147 displayLink(head);
148
149 return 0;
150
151 }
数据结构:DHUOJ 删除链表的顺数及倒数第N个节点的更多相关文章
- 数据结构和算法之单向链表二:获取倒数第K个节点
我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...
- 删除链表中等于给定值val的所有节点。
样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5. /** * D ...
- 动图:删除链表的倒数第 N 个结点
本文主要介绍一道面试中常考链表删除相关的题目,即 leetcode 19. 删除链表的倒数第 N 个结点.采用 双指针 + 动图 的方式进行剖析,供大家参考,希望对大家有所帮组. 19. 删除链表的倒 ...
- JS数据结构第二篇---链表
一.什么是链表 链表是一种链式存储的线性表,是由一组节点组成的集合,每一个节点都存储了下一个节点的地址:指向另一个节点的引用叫链:和数组中的元素内存地址是连续的相比,链表中的所有元素的内存地址不一定是 ...
- lintcode:删除链表中指定元素
题目 删除链表中等于给定值val的所有节点. 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1-> ...
- 【leetcode 简单】 第五十七题 删除链表中的节点
删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4 ...
- LeetCode:删除链表中的节点【203】
LeetCode:删除链表中的节点[203] 题目描述 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val ...
- 面试题22:链表中倒数第k个节点
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None ...
- LeetCode第[19]题(Java):Remove Nth Node From End of List(删除链表的倒数第N个节点)
题目:删除链表的倒数第N个节点 难度:Medium 题目内容: Given a linked list, remove the n-th node from the end of list and r ...
随机推荐
- C#?和??运算符以及合并条件表达式
最近项目中,常常碰到这个?和??这两个操作符,之前说得不够详细,趁着周末补全来,希望能够给大家带来帮助. (一)?操作符 我们知道值类型是不肯能为空的,它总是包含值的本身,不会为NULL,这估计也是值 ...
- 小白文-SpringMVC-解读DispatcherServlet源码
SpringMVC 学习完Spring框架技术之后,差不多会出现两批人: 一批是听得云里雾里,依然不明白这个东西是干嘛的: 还有一批就是差不多理解了核心思想,但是不知道这些东西该如何去发挥它的作用. ...
- RGBA()函数详解
RGBA()函数详解 RGBA()函数用于设定颜色和颜色的透明度:
- 【行业Tip】三电是什么
电动汽车的"三电"是指:电池.电机.电控.
- Caffe2源码解析
写在前面 上一篇文章对Caffe2中的core模块进行了简单拆解Caffe2源码解析之core,本篇给出其它模块的拆解,目的是大致了解每个模块的内容和目标,进一步理解Caffe2的整体框架.内容不多, ...
- 变量、变量作用域、常量final、变量的命名规范
变量 变量是什么:就是可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域. 注意事项: 每个变量都有类型,类 ...
- Android 12(S) 图形显示系统 - 初识ANativeWindow/Surface/SurfaceControl(七)
题外话 "行百里者半九十",是说步行一百里路,走过九十里,只能算是走了一半.因为步行越接近目的地,走起来越困难.借指凡事到了接近成功,往往是最吃力.最艰难的时段.劝人做事贵在坚持, ...
- CacheManager Net Core Redis 缓存
using CacheManager.Core; using System; using System.Collections.Generic; using System.Text; namespac ...
- Docker 学习之命令篇
Docker 学习之命令篇 1. docker images //镜像列表 2. docker ps –a //所有运行过的容器 3. docker ps –l 最后运行的容器 4. docker ...
- Prism 框架解读之一系列
名词解释 1.什么是IOC IOC是 Inversion of Control的缩写,多数书籍翻译成"控制反转". IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行 ...