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



    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;
    }
    
    
    


    版权声明:

  • 相关阅读:
    后端程序员必备的 Linux 基础知识+常见命令(近万字总结)
    信息收集流程
    在不影响程序使用的情况下添加shellcode
    使用Zolom内存解析运行python脚本(不落地)
    要点3:输入函数对比与自定义输入方式
    要点2:循环、条件控制
    对等连接和云联网
    上传自定义镜像到腾讯云
    Windows 激活
    MySQL错误(报错)一览表(对照表)
  • 原文地址:https://www.cnblogs.com/walccott/p/4956914.html
Copyright © 2020-2023  润新知