带头结点的单链表( 冒泡排序 一次遍历求中间结点的值) 链表 就地反转 倒数第k个结点

Source Code:

#include <iostream>
using namespace std;

typedef struct student
{
	int num;
	struct student *next;
}node;

node  *create()
{//with head node
	node *head,*p,*s;//head -->head    p-->end   s -->middle node 
	int num;
	head = new node[sizeof(struct student)];
	p=head;
	cin>>num;
	while(num!=-1)
	{
		s = new node[sizeof(struct student)];
		s->num= num;
		p->next = s;
		p = s;
		cin>>num;
		
	}
	p->next = NULL;

	return head;
}

int print(node *l)//return the len of the linklist
{
	node *p = l;
	int count = 0;
	p = p->next;
	while(p)
	{
		cout<<p->num<<" ";
		p= p->next;
		count++;
	}
	cout<<endl;
	return count;
}


int GetLen(node *l)
{
	node *p = l;
	int count = 0;
	p = p->next;
	while(p)
	{
		p= p->next;
		count++;
	}
	return count;
}

node *sort(node *l)
{//sort AES
	int len = GetLen(l);
	node *head = l;
	node *p;//move forward
	int temp;

	for(int i = 0;i<len-1;i++)
	{
		p = head->next;
		for(int j = 0;j<len-i-1;j++)
		{
			if(p->num>p->next->num)
			{
				temp = p->num;
				p->num = p->next->num;
				p->next->num = temp;
			}
			p = p->next;
			

		}
	}
	return head;
}



int GetCenterNode(node *l)
{//一次遍历求中间结点的值
	node *p2 = l;//two step
	node *p1 = l;//one step


	while(1)
	{
		p2 = p2->next->next;
		p1 = p1->next;
		if(p2->next == NULL)//len %2 ==0
			break;
		if(p2->next->next == NULL)//len %2 == 1
		{
			p1 = p1->next;
			break;
		}

	}
	return p1->num;

}

int main()
{
	node *StudentLink = create();
	int len= GetLen(StudentLink);
	cout<<"len="<<len<<endl;
	node *Sorted_StudetLink = sort(StudentLink);// O(n) + O(n*n)

	cout<<"After sorting ..."<<endl;
	print(Sorted_StudetLink);

	cout<<"the list's center node data is "<<GetCenterNode(StudentLink)<<endl;//O(n)

	return 0;
}

Result:





就地反转

ListNode* ReverseList(ListNode* pHead)
{
    ListNode* pNode=pHead;//当前结点
    ListNode* pPrev=NULL;//当前结点的前一个结点
    while(pNode!=NULL)
    {
        ListNode* pNext=pNode->m_pNext;
        pNode->m_pNext=pPrev;//当前结点指向前一个结点


        pPrev=pNode;//pPrev和pNode往前移动。
        pNode=pNext;//这里要使用前面保存下来的pNext,不能使用pNode->m_pNext
    }
    return pPrev;//返回反转链表头指针。
}


倒数第k个结点:

注意程序的鲁棒性

ListNode* KthNodeFromEnd(ListNode* pHead,int k)
{
    if(pHead==NULL||k==0)
        return NULL;

    ListNode* pNode=pHead;//当前结点
    ListNode* pKthNode=pHead;//

    while(k-1>0)
    {
        if(pNode->m_pNext!=NULL)
        {
            pNode=pNode->m_pNext;//让pNode先走k-1步
            --k;
        }
        else
            return NULL;
    }

    while(pNode->m_pNext!=NULL)
    {
        pNode=pNode->m_pNext;
        pKthNode=pKthNode->m_pNext;
    }

    return pKthNode;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值