左神的书——《程序员代码面试指南》之删除链表的倒数第k个节点 c++实现

原创 2017年01月03日 15:06:17

题目:

//删除单链表中倒数第k个节点。


思路:


//首先先找到这个节点,分别利用两个指针,pFast和pSlow,让pFast先走k步,(如果k大于链表的长度直接返回空)再两者同时移动,直到pfast为空,或pfst->next为空。
//此时pslow所指向的节点就是要删除的节点。
//删除这个节点分两种情况进行,第一种是这个节点是头节点,此时要将链表的头指针指向这个节点的下个节点,要在函数里修改主函数中pHead的指向,
//所以参数的类型需要指针的引用或二级指针。第二种情况就是普通的删除了。


#include<iostream>
using  namespace std ;
#include <cassert>

struct Node
{
	int value;
	struct Node * Next;

	Node(int data):value(data),Next(NULL) {    }
};


void DelLastKNode(Node*& pHead, size_t k) //删除倒数第k个节点。 指针的引用。
{
	assert (pHead);

	Node *pFast = pHead;
	Node *pSlow = pHead;

	while (k--) //这里条件还可以写成--k
	{
		// 如果k太大了,超出了链表的长度,直接返回Null.
		if (pFast == NULL)   //如果是--k,这里对应的为pFast->Next == NULL
		{
			return ;
		}
		pFast = pFast->Next;
	}

	while (pFast != NULL) //如果是--k,对应的为pFast->Next != NULL
	{
		pFast = pFast->Next;
		pSlow = pSlow->Next;
	}

	//删除找到的节点。
	if (pSlow == pHead)  //找到的是头节点
	{
		Node *pDel = pHead;
		pHead = pHead->Next;
		delete pDel;
	}
	else
	{
		Node *pCur = pHead;
		while (pCur->Next != pSlow)
		{
			pCur = pCur->Next;
		}
		pCur->Next = pSlow->Next;
		delete pSlow;
	}

	
}


int main()
{
	
		//这里只是单纯的分配节点,不释放节点,要不然篇幅太长了。毕竟节点的分配和释放不是重点。
		Node *n1 = new Node(1);
		Node *n2 = new Node(5);
		Node *n3 = new Node(8);
		Node *n4 = new Node(9);
		Node *n5 = new Node(12);
		Node *n6 = new Node(15);
		Node *pHead1 = n1;
		n1->Next = n2;
		n2->Next = n3;
		n3->Next = n4;
		n4->Next = n5;
		n5->Next = n6;

		 DelLastKNode(pHead1,6);
		 Node *pCur = pHead1;
		 while (pCur)
		 {
			cout << pCur->value <<endl;
			pCur = pCur->Next;
		 }
		

	cout << "hello..." <<endl;
	system("pause");
	return 0;
}


单链表操作之删除倒数第k个结点

****单链表操作之删除倒数第k个结点**** //函数功能:删除链表的倒数第k个结点;1 //自定义的结点结构体和头指针结构体: //函数原型:void DelKNode(pLin...
  • bitboss
  • bitboss
  • 2016年06月10日 18:28
  • 1680

删除链表中倒数第k个节点

1. 问题描述  给定一个单链表,删除它的倒数第k个节点。例如给定链表: 1→2→3→4→51\to 2 \to 3\to 4 \to 5,删除它的倒数第二个节点后变为 1→2→3→51\to 2 \...
  • Jeanphorn
  • Jeanphorn
  • 2015年07月20日 15:54
  • 2785

LeetCode 从链表中删除倒数第N个节点

从单链表中删除倒数第N个节点,要求之遍历一遍lia
  • dddongdong
  • dddongdong
  • 2014年10月23日 11:24
  • 2117

JAVA实现链表中倒数第K个节点问题(《剑指offer》)

题目描述 输入一个链表,输出该链表中倒数第k个结点。 解题思路: 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时...
  • qq_15062527
  • qq_15062527
  • 2015年10月02日 16:23
  • 1063

左神的书——《程序员代码面试指南》之最大01子矩阵的大小 c++实现

//题目: //给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。 //  1  0  1  1 //  1  1  1  1 //  1...
  • hj605635529
  • hj605635529
  • 2017年01月02日 17:55
  • 928

单向链表_找出倒数第K个节点

实现一个算法,找出单向链表中倒数第K个结点。
  • z597372259
  • z597372259
  • 2014年10月23日 20:48
  • 1957

leetcode 删除单链表中的倒数第k个元素

问题分析:
  • ych_ding
  • ych_ding
  • 2014年12月10日 21:46
  • 926

【程序员代码面试指南】python版(第一天)

一直徘徊在找实习的路上,不想自己做的事没有被记录下来。 以此部分博客记录自己的一些想法,给自己以后留下一点好的回忆吧。 关于左神的这本【程序员代码面试指南】,对我的帮助是很大的,确实弥补了以前不会...
  • crowhe1993
  • crowhe1993
  • 2016年10月12日 13:59
  • 515

链表(5)----查找链表倒数第K个节点

1、链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElem...
  • beitiandijun
  • beitiandijun
  • 2014年12月12日 10:36
  • 2547

单链表查找倒数第K个节点

写一个函数,输出单链表的倒是第K个节点。 思路分析: 方法一:用两个指针,p1和p2,p1先将链表遍历一遍,得到链表的长度length,然后二者一起走,当p1指向length-k-1的时候,p2指...
  • keyue123
  • keyue123
  • 2013年10月25日 20:03
  • 1240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左神的书——《程序员代码面试指南》之删除链表的倒数第k个节点 c++实现
举报原因:
原因补充:

(最多只允许输入30个字)