关闭

链表排序、链表删除、访问倒数第k个节点

标签: 链表
721人阅读 评论(0) 收藏 举报
分类:


1.设一个带头结点的单向链表的头指针为head,设计算法,将链表的记录,按照data域的值递增排序。

2.已知线性表中的元素以单链表作存储结构。试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。

3.输出该链表中倒数第k个结点, tail为倒数第0个节点


//

#include "stdafx.h"
#include<iostream>
using namespace std;
template<class T>
struct Node{
	T value;
	Node*next;
};

template<class T>
class list
{
private:
	Node<T>*head;
	Node<T>*tail;
	int len;//链表长度
public:
	list();
	Node<T>*append(T ele);
	Node<T>*findKthfromhead(int k);
	Node<T>*findKthfromtail(int k);
	Node<T>*sort_list(int endpos);//链表排序
	Node<T>*delete_list(T x, T y);//删除表中所有大于x且小于y的元素(若表中存在这样的元素)
	Node<T>*reverse_list();//反转
Node<T>*list<T>::delete_exist();//删除重复元素
int length();
};

template<class T>
Node<T>*list<T>::reverse_list()
{
<span style="white-space:pre">	</span>int k1 = length()-1;
<span style="white-space:pre">	</span>int k2 = 0;
<span style="white-space:pre">	</span>while (k1 - k2 > 0)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>int mm;
<span style="white-space:pre">		</span>mm = findKthfromhead(k1)->value;
<span style="white-space:pre">		</span>findKthfromhead(k1)->value = findKthfromhead(k2)->value;
<span style="white-space:pre">		</span>findKthfromhead(k2)->value = mm;
<span style="white-space:pre">		</span>--k1;
<span style="white-space:pre">		</span>++k2;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>return head;
}
template<class T>
Node<T>*list<T>::delete_list(T x, T y)
{
	_ASSERT(y > x);
	_ASSERT(len > 0);

	sort_list(len - 1);
	if (head->value >= y || tail->value <= x)
		return head;
	if (head->value > x)
	{
		Node<T>*m = new Node < T >;
		while (head->value < y)
		{
			Node<T>*node = new Node < T > ;
			node = head;
			if (head->next == NULL)
			{
				head = NULL;
				len = 0;
				return head;
			}
			head->value = head->next->value;
			head = head->next;
			--len;
			delete node;
		}
		return head;
	}
	
	Node<T>*node = new Node < T >;
	Node<T>*m = new Node < T >;
	node = head;
	while (node->value <= x)
	{
		m = node;
		m->value = node->value;
		node = node->next;
	}
	

	while (node->value < y)
	{
		Node<T>*n = new Node < T > ;
		n = node;
		if (node->next == NULL)
		{
			m->next = NULL;
			tail = m;
			--len;
			return head;
		}
		node->value = node->next->value;
		node = node->next;
		--len;
		delete n;
	}
	m->next = node;

	return head;
}
template<class T>
Node<T>*list<T>::sort_list(int endpos)//递归实现排序
{
	int k = 0;
	int pp;
	if (endpos == 0)
		return head;
	Node<T>*node = new Node < T >;
	node = head;
	while (k < endpos)
	{
		if (node->value > node->next->value)
		{
			pp = node->value;
			node->value = node->next->value;
			node->next->value = pp;
		}
		++k;
		node = node->next;
	}
	--endpos;
	sort_list(endpos);
	//delete node;
}

template<class T>
Node<T>*list<T>::findKthfromhead(int k)
{
	//if (len == 0)
	//	return NULL;
	_ASSERT(k < len);
	Node<T>*KthNode = new Node < T > ;
	KthNode = head;
	while (k)
	{
		KthNode = KthNode->next;
		--k;
	}

	return KthNode;
}

template<class T>
Node<T>*list<T>::findKthfromtail(int k)
{
	_ASSERT(k < len);
	
	return findKthfromhead(len-1-k);
}

template<class T>
int list<T>::length()
{
	return len;
}

template<class T>
Node<T>*list<T>::append(T ele)
{
	if (head == NULL)
	{
		head = new Node < T > ;
		tail = new Node < T >;
		head->value = ele;
		head->next = NULL;
		tail->value = ele;
		tail->next = NULL;
		len = 1;
		return head;
	}
	if (head->next == NULL)
	{
		head->next = tail;
		tail->value = ele;
		tail->next = NULL;
		len = 2;
		return head;
	}
	else
	{
		Node<T>*node = new Node < T > ;
		node->next = NULL;
		node->value = ele;
		tail->next = node;
		tail = node;
		++len;
		return head;
	}
}

template<class T>
list<T>::list()
{
	head = NULL;
	tail = NULL;
	len = 0;
}
template<class T>
Node<T>*list<T>::delete_exist()
{
<span style="white-space:pre">	</span>sort_list(len - 1);
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>Node<T>* node,*n,*m;


<span style="white-space:pre">	</span>n=node = head;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>while (node->next != NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>if (node->value == node->next->value)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>while (node->next != NULL&&node->value == node->next->value)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>m = node;
<span style="white-space:pre">				</span>node = node->next;


<span style="white-space:pre">				</span>delete m;
<span style="white-space:pre">				</span>--len;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>n->next = node;
<span style="white-space:pre">			</span>node = node->next;
<span style="white-space:pre">			</span>
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>else
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>n = node;
<span style="white-space:pre">			</span>node = node->next;


<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>/*
<span style="white-space:pre">	</span>while (node->next != NULL)
<span style="white-space:pre">	</span>{


<span style="white-space:pre">		</span>m = n->next;
<span style="white-space:pre">		</span>m->value = n->next->value;
<span style="white-space:pre">		</span>while (n->value == n->next->value)
<span style="white-space:pre">		</span>{


<span style="white-space:pre">			</span>m = n;
<span style="white-space:pre">			</span>m->value = n->value;
<span style="white-space:pre">			</span>n->value = n->next->value;
<span style="white-space:pre">			</span>n = n->next;
<span style="white-space:pre">			</span>if (n->next == NULL)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>//delete m;  
<span style="white-space:pre">				</span>--len;
<span style="white-space:pre">				</span>return head;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>//delete m;  
<span style="white-space:pre">			</span>--len;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>node->next = m;
<span style="white-space:pre">		</span>node->next->value = m->value;


<span style="white-space:pre">		</span>n = n->next;
<span style="white-space:pre">		</span>n->value = n->next->value;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>*/


<span style="white-space:pre">	</span>return head;


}
int _tmain(int argc, _TCHAR* argv[])
{
	list<int>aa;
	aa.append(6);
	cout <<"长度为"<< aa.length() << endl;
	aa.append(5);
	cout << "长度为" << aa.length() << endl;
	aa.append(4);
	cout << "长度为" << aa.length() << endl;
	aa.append(3);
	cout << "长度为" << aa.length() << endl;
	aa.append(2);
	cout << "长度为" << aa.length() << endl;
	cout <<"第三个数为"<< aa.findKthfromhead(3)->value << endl;
	cout << "倒数第三个数为" << aa.findKthfromtail(3)->value << endl;
	aa.sort_list(aa.length() - 1);
	//aa.delete_list(1, 7);
	aa.delete_list(1, 4);
	cout << "长度为" << aa.length() << endl;
	for (int i = 0; i < aa.length(); i++)
		cout << aa.findKthfromhead(i)->value << endl;

	system("pause");
	return 0;
}




0
0
查看评论

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

1. 问题描述  给定一个单链表,删除它的倒数第k个节点。例如给定链表: 1→2→3→4→51\to 2 \to 3\to 4 \to 5,删除它的倒数第二个节点后变为 1→2→3→51\to 2 \to 3\to 5。可以假设倒数第k个节点总是存在。2. 方法与思路  很容易想到第一种方法,就是先...
  • Jeanphorn
  • Jeanphorn
  • 2015-07-20 15:54
  • 2786

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

单链表删除倒数第k个节点 题目: 删除单链表中倒数第k个节点解题思路及算法代码:标尺法,定义两个指针指向链表头结点,先让一个走k步,然后两个指针同时开始走,当先走的指针走到末尾时,后走的指针指向的结点就是需要删除的结点。单链表结构定义:typedef struct Node { int d...
  • y396397735
  • y396397735
  • 2016-05-20 10:25
  • 641

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

****单链表操作之删除倒数第k个结点**** //函数功能:删除链表的倒数第k个结点;1 //自定义的结点结构体和头指针结构体: //函数原型:void DelKNode(pLinList pList, int k); ps:我在博客中每次的思路分析,只是将我的对每道题的理解...
  • bitboss
  • bitboss
  • 2016-06-10 18:28
  • 1680

[链表]-在单链表和双链表中删除倒数第K个节点

【题目】 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。 【要求】 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。 【解答】 单链表: public class Node{ public int value; pu...
  • qq_33526293
  • qq_33526293
  • 2017-12-04 18:01
  • 22

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

写一个函数,输出单链表的倒是第K个节点。 思路分析: 方法一:用两个指针,p1和p2,p1先将链表遍历一遍,得到链表的长度length,然后二者一起走,当p1指向length-k-1的时候,p2指向的就是倒数第k个节点。 node *search(node *head,int k) ...
  • keyue123
  • keyue123
  • 2013-10-25 20:03
  • 1239

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

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

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

题目描述 输入一个链表,输出该链表中倒数第k个结点。 解题思路: 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点。 解答: ...
  • qq_15062527
  • qq_15062527
  • 2015-10-02 16:23
  • 1059

算法:查找链表中倒数第k个节点

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历这个链表,...
  • sinat_20265495
  • sinat_20265495
  • 2016-10-30 20:54
  • 1082

坚持坚持!用Java写出删除一个链表的倒数第N个节点,并返回头节点(N总是可达的)

这个题目有个前提条件就是N总是可达的,所以直接省去了一种情况(N不可达时的情况) 思路: 数据结构里面首先给定两个指针p和q分别都指向这个链表的头节点,然后若想求出这个链表的倒数第N个节点,方法就是先让p向后挪N个位置,q不动。 因为N总是可达的,所以会有俩种情况, 1、这个链表就只有N个节...
  • yangmm2048
  • yangmm2048
  • 2015-04-06 11:23
  • 834

在单链表中删除倒数第k个节点(java实现)

实现方式很多,在这里只说两种实现方式。看不懂时候,大家可以画画图,对理解为什么很有帮助。 第一种方式: 1.首先判断K值和链表是否为空,如果k<=0,或链表为空,直接返回head; 2.满足上面条件后,定义NodeList P=head,重头开始遍历链表,走k步后,退出循环(在此循环中,...
  • csdn_cwj
  • csdn_cwj
  • 2016-05-28 11:15
  • 1473
    个人资料
    • 访问:622405次
    • 积分:10493
    • 等级:
    • 排名:第1904名
    • 原创:468篇
    • 转载:61篇
    • 译文:0篇
    • 评论:65条
    最新评论