删除链表的顺数及倒数第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个节点的更多相关文章

  1. 数据结构和算法之单向链表二:获取倒数第K个节点

    我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...

  2. 删除链表中等于给定值val的所有节点。

    样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5. /** * D ...

  3. 动图:删除链表的倒数第 N 个结点

    本文主要介绍一道面试中常考链表删除相关的题目,即 leetcode 19. 删除链表的倒数第 N 个结点.采用 双指针 + 动图 的方式进行剖析,供大家参考,希望对大家有所帮组. 19. 删除链表的倒 ...

  4. JS数据结构第二篇---链表

    一.什么是链表 链表是一种链式存储的线性表,是由一组节点组成的集合,每一个节点都存储了下一个节点的地址:指向另一个节点的引用叫链:和数组中的元素内存地址是连续的相比,链表中的所有元素的内存地址不一定是 ...

  5. lintcode:删除链表中指定元素

    题目 删除链表中等于给定值val的所有节点. 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1-> ...

  6. 【leetcode 简单】 第五十七题 删除链表中的节点

    删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4 ...

  7. LeetCode:删除链表中的节点【203】

    LeetCode:删除链表中的节点[203] 题目描述 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val ...

  8. 面试题22:链表中倒数第k个节点

    # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None ...

  9. 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 ...

随机推荐

  1. String类型转int类型方法

    System.out.println( "Integer.parseInt(\"5\") =" + Integer.parseInt("5" ...

  2. Java基础--序列化和反序列化

    作用:在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Sessi ...

  3. 3D打印第二弹:狗牌

    给朋友做一个狗牌(误,给朋友的狗狗做一个狗牌 1. 设计 没有设计功底,看看别人是如何做的,搜到一个狗牌: 照着这个做一个,正面是上图这种的:狗狗名字+狗爪子:另一面是手机号加联系说明文字. 2. 建 ...

  4. 哈工大 计算机网络 实验一 HTTP 代理服务器的设计与实现

    计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 HTTP 代理服务器的设计与实现 实验目的: 熟悉并掌握 Socket 网络编程的过程与技术:深入理解 HTTP 协议, 掌握 ...

  5. Sqlserver 2008 导出数据库

    sqlserver2008中导出数据库: ①当数据库中的数据量比较大时,可使用备份的方法. 路径可以默认,想自定义就点击[添加],最后[确定]即可. ②当数据量不是很大时,可以采用导出SQL执行语句的 ...

  6. think php 多条件检索+自带分页+多条件搜索标红分页

    //视图<form action="/homework/homework/index" method="get"> <input type=& ...

  7. ASP.NET Core 6框架揭秘实例演示[22]:如何承载你的后台服务[补充]

    借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中.任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,A ...

  8. python安装jupyter notebooks(windows下)

    [1]前提 前提:下载好Python并把python添加到了Path路径 以3.8为例子,在安装的时候有个这个勾选项,Add Python 3.8 to PATH,勾上就好,没有的话.就把python ...

  9. Python IO文件管理

    文件操作 我们可以使用python来操作文件,比如读取文件内容.写入新的内容等,因为任何计算机文件的本质都是一些有不同后缀的字符组成的. python文件操作的两种模式 打开模式 while,写入模式 ...

  10. 保姆级SpringBoot+Vue图片上传到阿里云OSS教程

    小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...