数据结构: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 ...
随机推荐
- 【windows 操作系统】窗口指针 和 窗口句柄 有什么区别
句柄是指针的"指针" 指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据.Windows并不希望一般程序修改其内部数据结构,因为这样太不安全.所以Windows给每 ...
- 【基础知识】CPU上下文切换(进程上下文切换 - 线程上下文切换 - 中断上下文切换)
CPU 上下文切换是什么 CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器 ...
- 【C# 编码格式】 System.Text 命名空间 Encoding
Encoding基类 System.Text.ASCIIEncoding类 System.Text.UnicodeEncoding类 System.Text.UTF32Encodin ...
- 【C# 基础概念】静态常量和动态常量的区别
C# 静态常量和动态常量的区别 C#中有两种常量类型分别为readonly(运行时常量)与const(编译时常量),readonly是变量的常量,const是字面量的常量本文将就这两种类型的不同特性进 ...
- yaml文件学习笔记
01 介绍 YAML 是 "YAML Ain't Markup Language" 的递归缩写.在开发的这种语言时,YAML 的意思其实是:"Yet Another Ma ...
- linux 解决磁盘占用100%
df -h 查看磁盘使用情况 ll -h 查看文件的大小 使用如下命令查找大于100M的大文件,发现有几个日志文件及临时文件比较大,使用rm –rf删除即可. find / -size +10 ...
- Java基础--集合解析-ArrayList
1.ArrayList中添加,获取,删除元素: 2.ArrayList中是否包含某个元素: 3.ArrayList中根据索引将元素数值改变(替换): 4.ArrayList中查看(判断)元素的索引: ...
- POJ2112题解
题目大意:K个挤奶机,C头牛,每个挤奶机最多可以接待M头牛,各个K,C之间可能有道路连接,要让每个牛都找到挤奶机,求最小的走的路程最远的牛所需走的距离. 思路:首先看到要最小化最大值,所以需要二分.可 ...
- 分布式 PostgreSQL - Citus 架构及概念
节点 Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在"无共享(shared nothing)"架构中相互协调.这些节点形成一个集群,允许 Post ...
- numpy最后一部分及pandas初识
今日内容概要 numpy剩余的知识点 pandas模块 今日内容详细 二元函数 加 add 减 sub 乘 mul 除 div 平方 power 数学统计方法 sum 求和 cumsum 累计求和 m ...