删除链表的顺数及倒数第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. idea教程--如何申请免费的ideaIDE

    开始申请前请先到 https://www.jetbrains.com/zh/student/ 阅读免费学生授权的介绍和常见问题,再依照下方流程进行申请. (1)到 https://www.jetbra ...

  2. Activity跳转显式方法及隐式方法

    1 public class AActivity extends AppCompatActivity { 2 private Button btnJump; 3 @Override 4 protect ...

  3. 计算机系统4-> 计组与体系结构1 | 基础概念介绍

    在大二上学期学习数字逻辑的过程中,我对计算机如何运作产生了兴趣,因此开了这个系列来记录自己在这方面的学习过程,此前三篇分别是: 计算机系统->Hello World的一生 | 程序如何运行,从大 ...

  4. 01-RocketMQ介绍

    一.MQ介绍 1.什么是MQ?为什么要用MQ? MQ:MessageQueue,消息队列. 队列,是一种FIFO 先进先出的数据结构.消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进 ...

  5. 用端口映射的办法使用矩池云隐藏的vnc功能

    矩池云隐藏了很多高级功能待用户去挖掘. 租用机器 进入jupyterlab 设置vnc密码 VNC_PASSWD="userpasswd" ./root/vnc_startup.s ...

  6. think php 7天免登录

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. LGP5795题解

    首先 \(k\) 大容易让我们想到 主席树&树套树&整体二分,而异或又让我们想到 01-Trie. 所以就有一个很明显的二分,二分一个 mid 看有多少个数不大于 mid. 然后发现 ...

  8. ffmpeg修改视频文件的分辨率

    在本文中,我们将展示如何调整任何视频文件的大小. 这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案. 更改视频文件的分辨率将是 ...

  9. [源码解析] TensorFlow 分布式环境(2)---Master 静态逻辑

    [源码解析] TensorFlow 分布式环境(2)---Master 静态逻辑 目录 [源码解析] TensorFlow 分布式环境(2)---Master 静态逻辑 1. 总述 2. 接口 2.1 ...

  10. 5月7日 python学习总结 MySQL数据库(一)

    一.数据库介绍 1.数据库相关概念 数据库服务器(本质就是一台计算机,该计算机之上安装有数据库管理软件的服务端) 数据库管理系统RDBMS(本质就是一个C/S机构的套接字软件) 库(文件夹)===&g ...