关于尾插法的优化和快慢指针查找中间节点

本文介绍了一种链表尾插法的实现,并通过Python代码进行了详细演示。此外,还提供了使用快慢指针寻找链表中点的方法。
针对昨天的尾插法  更清晰的了解了指针的思路 优化代码如下
附快慢指针 查找中间节点代码


import  random as rd
import  copy

class Linklist(object):
    def __init__(self,data,next=None):
        self.data=data
        self.next=next

def createListTail(n):
    list = []
    head=Linklist(0)  ##指针头
    p=head            ##程序的核心点就是这个游标
    for i  in range(n):
        num = rd.randint(0, 100)
        list.append(num)
        temp=Linklist(num)
        p.next=temp
        p=temp
        head.data+=1 ##链表长度加1
    temp.next=None
    print('raw data',list)
    return head



def searchMid(L):
    realData=L.next
    mid=copy.copy(realData)
    while realData.next!=None:
        if realData.next.next!=None:
            realData=realData.next.next
            mid=mid.next
        else:
            realData=realData.next
    return mid


if __name__=='__main__':
    head=createListTail(10)

    realData=head.next
    list = []
    while realData!=None:
        list.append(realData.data)
        realData=realData.next
    print('linklist===',list)
    print('linklist len====',head.data)

    num=searchMid(head)
    print('The mid num is',num.data)

#include<iostream> using namespace std; typedef int Elemtype; //构建一个节点类:包含数据域指针域 class Node { public: Elemtype data; Node* next; }; //构建一个单链表类 class LinkList { public: LinkList();//构造函数:构建一个单链表 ~LinkList();//销毁一个单链表 void watchLinkList();//遍历单链表 int GetLength();//获得长度 bool isEmpty();//判断是否为空 Elemtype* Find(Elemtype data);//查找节点 bool InsertElemAtEnd( Elemtype e);//尾插法 bool InsertElemAtHead(Elemtype e);//头 int DeleteNode(int pos);//删 void freeList();//删除所有元素 int findNodeFS(int k); private : Node* head;//头节点 }; //初始化链表 LinkList::LinkList() { //先开辟空间 head = new Node; head->data = 0;//数据域先置为0 head->next = NULL;//头节点的指针域为空 } LinkList::~LinkList() { freeList(); delete head; } //头法 bool LinkList::InsertElemAtHead( Elemtype e) { Node* p = new Node;//先开辟空间 if (!p) { return false; } p->data = e; p->next = head->next; head->next = p; return true; } //尾插法 bool LinkList::InsertElemAtEnd(Elemtype e) { Node* p = head; while (p->next != NULL) { p = p->next; } Node* tail = new Node; tail->data = e; p->next = tail; tail->next = NULL; return true; } //删除节点 int LinkList::DeleteNode(int pos) { //临时指针P查找删除的位置 Node* p = head; int i = 0; while (i < pos - 1) { p = p->next; i++; if (p == NULL) { return 0; } } if (p->next == NULL) { cout << "要删除的位置错误" << endl; return 0; } Node* q = p->next; p->next = q->next; delete q; return 1; } void LinkList::watchLinkList() { Node* p = head->next; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } int LinkList::GetLength() { Node* p = head->next; int length = 0; while (p != NULL) { p = p->next; length++; } return length; } void LinkList::freeList() { Node* p = head->next; Node* q; while (p != NULL) { q = p->next; delete(p); p = q; } head->next = NULL; } bool LinkList::isEmpty() { if (this->head == NULL) { return true; } else { return false; } } Elemtype* LinkList::Find(Elemtype e) { Node* p = head; while (p != NULL) { if (p->data == e) { return &e; } p = p->next;// } } //使用双指针找到倒数第K个节点 int LinkList::findNodeFS(int k) { Node* fast = this->head; Node* slow = this->head; //快指针先走k步 for (int i = 0; i < k; i++) { fast = fast->next; } while (fast != NULL) { slow = slow->next; fast = fast->next; } //输出倒数第k个节点的值 cout << "倒数第K个节点的值为:" << slow->data << endl; return slow->data; } int main() { LinkList l; /*Node node;*/ l.InsertElemAtHead(1); l.InsertElemAtHead(2); l.InsertElemAtHead(3); l.InsertElemAtHead(4); l.watchLinkList(); l.InsertElemAtEnd(5); l.InsertElemAtEnd(6); cout << "这是第二次入后的链表" << endl; cout << "判断链表是否为空" << endl; l.watchLinkList(); bool ret = l.isEmpty(); cout << "ret =" << ret << endl; //查找值为3的元素 int *p = l.Find(3); cout << "*p=" << *p << endl; //查找值为100的元素 int*temp = l.Find(100); cout << "temp ==" << *temp << endl; int length = l.GetLength(); cout << "length = " << length << endl; cout<<l.findNodeFS(2); return 0; } //查找倒数第K个节点:利用快慢指针进行查找 //问题分析:因为链表没有长度所以用快慢指针做出一个距离,当距离 = K的时候快指针到达链表部 为什么我输出不了findnodefs函数的值
最新发布
09-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值