链表分割(将小于x的结点放在大于x结点之前)(详细)(Java实现)

题目:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

示例:

 

思路:

确定大体解决思路:定义两个逻辑上的链表( ans1 和 ans2),ans1 存小于 x 的结点,ans2 存大于 x 的结点。最后找到 ans1 的最后一个结点,将其 next 指向 list2 进行合并即可。

具体实现:

1. 要进行整个链表结点的遍历,所以循环条件为 cur != null 。

2. 需要尾插操作,所以为了避免空指针异常,要分别定义两个工具结点,分别为 ans1 和ans2 的头结点和尾结点,头结点用来进行最后的合并,尾结点用来进行尾插结点。(这样使用工具结点,既可以方便操作,也可以避免特殊情况的出错)。

3.画图理解主要操作:

 这里直接使用 ans1 和 ans2 直接定义为头结点,最后直接返回 ans1.next 即可。

代码:

 public ListNode partition(ListNode pHead, int x) {
        ListNode ans1 = new ListNode(0); //传入0是因为原题只有这一个构造方法
        ListNode last1 = ans1;
        ListNode ans2 = new ListNode(0);
        ListNode last2 = ans2;

        ListNode cur = pHead;
        while (cur != null){
            ListNode next = cur.next;
            if (cur.val < x){
                cur.next = null;
                last1.next = cur;
                last1 = cur;
                cur = next;
            }else{
                cur.next = null;
                last2.next = cur;
                last2 = cur;
                cur = next;
            }
        }
        last1.next = ans2.next;
        return ans1.next;
    }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于编程的问题,我可以回答。以下是一个用C语言编写的代码示例: ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode *next; } ListNode; ListNode* partition(ListNode* head, int x) { ListNode *smallHead = NULL, *smallTail = NULL; ListNode *largeHead = NULL, *largeTail = NULL; ListNode *cur = head; while (cur != NULL) { if (cur->val < x) { if (smallHead == NULL) { smallHead = smallTail = cur; } else { smallTail->next = cur; smallTail = cur; } } else { if (largeHead == NULL) { largeHead = largeTail = cur; } else { largeTail->next = cur; largeTail = cur; } } cur = cur->next; } if (smallHead == NULL) { return largeHead; } smallTail->next = largeHead; if (largeTail != NULL) { largeTail->next = NULL; } return smallHead; } int main() { ListNode *head = (ListNode*)malloc(sizeof(ListNode)); head->val = 1; head->next = (ListNode*)malloc(sizeof(ListNode)); head->next->val = 4; head->next->next = (ListNode*)malloc(sizeof(ListNode)); head->next->next->val = 3; head->next->next->next = (ListNode*)malloc(sizeof(ListNode)); head->next->next->next->val = 2; head->next->next->next->next = (ListNode*)malloc(sizeof(ListNode)); head->next->next->next->next->val = 5; head->next->next->next->next->next = NULL; ListNode *newHead = partition(head, 3); while (newHead != NULL) { printf("%d ", newHead->val); newHead = newHead->next; } printf("\n"); return 0; } ``` 这个代码使用了两个指针smallHead和largeHead,分别表示小于x和大于或等于x的链表的头结点。遍历原链表,将小于x的结点加入small链表,将大于或等于x的结点加入large链表。最后将small链表的尾结点指向large链表的头结点,返回small链表的头结点即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值